数字夜话的博客

开始好好写博客.

Switf 初学习

wwwdc 2014大会,苹果推出了新语言—雨燕swift。虽然很多开发者如往年一样,进行了大量的神吐槽,但是为了尽快成为坐在马背上的那个人—跟着趋势走,还是来赶快学习一下雨燕吧。

xcode 6 beta

伴随着雨燕发布的开发工具是xcode 6测试版,下载安装后。创建单个控制器的程序,我们可以知道可以选择Objective-c或者Swift语言来进行开发。不多说,选择Swift看看差异:

"工程目录结构"

  • 工程目录更简洁

    我们可以知道在xcode5的版本中,文件夹分为:工程文件夹、单元测试文件夹、框架文件夹和product文件夹。xcode6直接省去了框架文件夹。

  • 类文件的简化

    我们可以看到AppDelegate.swift和ViewController.swift两个类文件,main.storyboard一如往常。由此可知,类文件.h与.m合并为一个.swift,减少头文件与实现文件的切换过程。

  • 更少的支持文件

    没有了main.m程序入口文件、prefix.pch文件和国际化语言plist文件,仅仅剩下一个yourproject.plist配置文件。

  • 没有默认的lib文件

    通过.swiftimport UIKit和target>> build phase的link binary with lib 为空可知:foundation.frameworkUIKit.frameworkXCTest.framework三个基础框架系统不在显示,UIKit将作为必须框架自动为您导入到工程中.说明了:系统其实还是自动为您导入了一个UIKit框架,但以后link binary lib中将直接显示你导入和用到的framework&lib文件。

进入swift世界

Swift是建立在C与Objective-c优点上的用于编写IOS和Mac OSX应用的一门新语言。为了实现更简单、灵活而有趣的编程,它摒弃了C语言兼容上的限制性,集合了更多的安全编程模块和现代的编程特性。

再见hello world

按照编程界惯例,来写一条hello world。

1
println('hello world')

恭喜您,你学会了一门语言!lol,是不是很熟悉呢?其实就是C上的log语句,只不过少了分号。对的,swift允许您:

1. 不导入基础库。如i/o或者string文件。
2. 不需要main函数。在任何全局范围内写语句,都会被当作是入口。囧,当然这在工程里还是从appDelegate开始。
3. 不需要分号。blog主表示再次冒汗。

常量与变量

swift中对于简单型数据只有两个关键字,常量let和变量var。赋值时变量名=必须用空格分开,否则编译器报错。

1
2
3
4
5
6
7
8
9
10
11
/*------对于常量,你必须给他赋一个值-----------*/
let implicInt    = 70          //不明确的赋值
let implicDouble = 70.0        //不明确的赋值
let explicDouble:Double = 70   //明确说明是double类型赋值

/*------对于类型转换,必须明确指出-----------*/
let str        = "this is string"
let int_a  = 70
let int_b  = 80
let str_int    = str + String(int_a) //您必须明确指出需要转换类型,否则编译器会报错。
let string_ing = "\(int_a) + \(int_b) = \(int_a+int_b)" //另一种转换

可空变量既可以是一个值,也可以是一个nil来表明该值不存在。可空变量在变量名后用var 变量名:数据类型?表示。

数组与字典

通过[]来创建数组与字典,并且通过索引或者键值来创建元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*------创建空数组或字典-----------*/
let emptyarr = String[]()
let emptydic = Dictionary<string,float>()

/*------您也可以这样引用空数组-----------*/
     emptyarr = []
     emptydic = [:]

/*------创建带值的数组或字典-----------*/
var letters = ["A","B","C"]
    letters[1] = "A"
var letters = [
    "keyA":"A",
    "keyB":"B"
]

控制流

使用ifswitch作为控制条件,使用forfor-inwhiledo-while循环迭代。它们的参数是可选的,但是主体是必须的。

1
2
3
4
5
6
7
8
9
10
11
/*------迭代方式-----------*/
let arrs = [10,20,30,40]
var result = 0
for aVar in arrs {
result += aVar
}
println("result is:\(result)")

/*------if 条件语句必须是明确的布尔值-----------*/
var notAboolen = 0
if notAboolen {}     //这种方式是错的,switf 不知道notAboolen是布尔值。

你可以用let配合可空变量作为if的条件判断。在条件语句中可空变量赋值给let常量后,如果是nil则常量变为false布尔型;否则为true。

1
2
3
4
5
6
7
8
var optVar: String? = "John"  //result: hello,john
//optVar = nil                //result: hello!
var greeting = "Hello!"
let name = optVar
if name {                      //也可以这样写 if let name = optVar {}
    greeting = "Hello, \(name)"
}
println("\(greeting)")

swith 语句

switch语句支持所有类型的比较,不仅限与整型条件,也可以是复杂的判断操作等,无break语句。在swift中default条件是不能少的,并且最起码要有一条执行语句。而且执行完一个判断条件主体,程序直接跳出swith块。

1
2
3
4
5
6
7
8
9
10
11
12
13
var vResult = ""
let vegetable = "red pepper"
switch vegetable {
    case "celery":
        vResult = "Add some raisins and make ants on a log."
    case "cucumber", "watercress":
        vResult = "That would make a good tea sandwich."
    case let x where x.hasSuffix("pepper"): // x变量尾部是否包含pepper
        vResult = "Is it a spicy \(x)?"
    default:                                       //不可少
        vResult = "Everything tastes good in soup."//最起码包含一条语句
}
println("\(vResult)")     // result:Is it a spicy red pepper?

for-in 语句

for-in 对于枚举一个字典,我们可以使用两个用(键,值)来作为枚举方式的过程变量。对比OC来说,这不失为是一种更简洁的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var anEmployee = [
    "company":"myCompamy",
    "empName":"jonz",
    "department":"dev",
    "salary":"3000"
]
println("here is an employee infomation:")
for (key,value) in anEmployee
{
    println("       \(key):\(value)")
}
/*-------the result is:--------------*/
here is an employee infomation:
    empName:jonz
    department:dev
    salary:3000
    company:myCompamy

使用.....来表示范围

对于明确循环界限的迭代,我们可以使用..来作循环。比如求从0到3之间的数字和:

1
2
3
4
5
6
7
8
9
10
11
var count = 0
for i in 0..4{ //注意迭代编程中的少1问题,这里相当于for var i=0;i<4;i++
    count += i
}
println("\(count)") //result is:6

count = 0
for i in 0...3{ //注意迭代编程中的少1问题,这里相当于for var i=0;i<=3;i++
    count += i
}
println("\(count)") //result is: 6

我们知道,新的特性使语句更加简短,..不包含范围的上界,...包含了范围的上界.

end line

好了,就先写到这里。对于编程里的函数与类、对象,由于内容比较多将记录在下一篇blog里。