Swift 是苹果推出的一门新语言,它的语法仍然是在 C 语言基础上的延伸,溶入了面向对象语言和脚本语言的特征,还有一点 Objective-C 的影子。
基本类型
Swift 是强数据类型的,也是类型安全的,常量和变量都有着明确的类型。大多数情况下,编译器可根据赋值推导出类型,从而帮助省略代码书写,使得代码比较简洁。Swift 中的类型包括基本类型(Int, Double等),还包括类、结构和枚举。类型在 Swift 中称作 Type。
定义常量与变量使用 let 和 var 关键字。let 用于定义常量,var 则定义变量,形式为:
var v : Type = .. // 定义一个变量
let c : Type = .. // 定义一个常量
以字典为例,Swift 使用 let 和 var 来定义可修改字典和不可修改字典,这与 Objective-C 中以 NSDictionary 和 NSMutableDictionary 分开实现是不同的。
Swift 的基本类型包括 Int, Float, Double, Bool, String 等。
整型类型其实包含了 Int8, Int16, Int32, Int64 四种类型,在没有明确位宽要求的情况下,使用 Int 即可,编译器会根据机器位宽自动选择。对于整型数值的类型推导,Swift 优先选择 Int 型。
浮点类型包括了32位的 Float 和64位的 Double 两种类型,同样,在没有明确位宽要求的情况下,推荐使用 Double。对于浮点数值的类型推导,Swift 优先选择 Double 型。如果表达式中有整型和浮点型,则推导类型为 Double型。
布尔型 Bool,只能取 true 和 false,Swift 的类型安全不允许像 C 语言那样将整型转为布尔型。
字符串类型 String 是一组 Character 的有序集合,包括了若干 Unicode 字符。
运算符
Swift 的运算符完全涵盖了 C 的运算符,包括:基本运算,一元运算,复合运算,男较运算,关系运算,移位运算符,位域运算等等。
Swift 在运算符上还做了一些扩展。最大的变化是增加了范围运算符 ..< 和 ...
..< 是半开区间范围,表示`[start, end)`,如 1 ..< 3 表示 1, 2。
... 是闭区间范围,表示`[start, end]`,如 1 ... 3 表示 1, 2, 3。
范围运算常用于循环语句和 switch 语句。
Swift 扩展了求模运算符 %,可以对浮点做模运算,如 8 % 2.5 = 0.5。
赋值运算符的语义发生了变化,不再像 C 语言那样返回数值,也即 (a = b) != c 这样的语法不再支持。
Optional
Optional 类型由 Type? 定义,它的引入是为了处理有值/无值问题。一个 Optional 变量要么无值(缺失某类型的值),要么有某种值。无值即 unset,或称为 nil。
Swift 的 Optional 类型可以支持任意类型,包括类、结构和枚举类型。Objective-C 的nil 只能用于 class 这种引用类型,表达的是空指针的含义,含义上与 Swift 也有不同。
可以给 Optional 变量赋 nil,但不能给非 Optional 变量赋 nil。定义Optional 变量但不设初值的,默认被设为nil。
判断一个 Optional 变量是否有值,可以用 if 等条件判断语句,如确定有值,则可在变量后加!来提取类型值,这称作强制取值(forced unwrapping),例如:
if someOptional != nil {
println(“\(someOptional!)”)
}
如果对一个无值的 Optional 变量取值,程序将崩溃。
上述语句还可以可以写作:
if let arg = someOptional {
println(“\(arg)”)
}
这种用法称作 Optional binding。若语句内需要修改 arg,也可以使用 var 关键字。
如果已知某个 Optional 变量有值,可以不必执行检查而直接取值,这类变量在定义时,类型后面添加!标识,使用时表现为普通变量而非 Optional 变量。
let possibleValue : String? = “have value”
let assumedValue : String! = “implicitly unwrapped optional”
在使用 assumedValue 时,无需再加!取值,这种方式称作隐式取值。对于这类变量,仍然可以用 if 等条件判断其是否有值。
可以理解为,隐式 Optional 其实仍是 Optional 类型,只是引用时自动加上了取值操作。
Swift 提供了 nil 合并运算符,形式为:( a ?? b )
若 Optional 变量 a 有值,则取 a 的值,否则返回非Optional变量 b 作为默认值。
数组、字典与集合
数组、字典和集合是 Swift 提供的集合类型。
数组是一组相同元素类型的有序值集合,类型以 Array 表示。数组的定义使用Array<Type>或者使用更简单的[Type]语法定义,比如创建空数组:Array<Int>() 或者 [Int]()。
let a : Array<Int> = [1, 2, 3]
由于 Swift 可以进行类型推导,因此上面的语句也可以写为:
let a = [1, 2, 3]
数组提供了一些属性,如获取数组元素数量的 count 属性,判断数组是否为空的 isEmpty 属性。
数组元素的引用使用下标语法,下标从0开始,支持范围运算符,如a[0] 或者 a[0...1]。下标语法可用作元素赋值,但不可用于添加或插入新元素。
添加元素使用 append 方法。还可通过 += 添加另一个数组,这涉及到了运算符重载的概念(操作符两端须为同一类型,也即需数组类型,而非元素类型)。
其它常用方法还有 insert, removeAtIndex, reverse 等。
遍历数组可使用 for-in 语法,或者通过 enumerate 全局函数获取带下标及值的元组:
for (index, value) in enumerate(array) {
...
}
字典类型以 Dictionary 表示,字典的定义与使用与数组类似:
定义字典:Dictionary<Key, Value>或[Key:Value]
使用下标语法访问。
由于字典里某个键值不一定有对应的值,因此总是返回 Optional 类型。
集合类型以 Set 表示,一组相同元素类型的无序值集合,与数组类似。
集合并没有简写语法,定义集合:
var s : Set<Type> = [value1, value2, value3]
元组
元组是由多个值组成的复合值,其成员可以是不同类型。元组的引入,使一小组相关数据的传递变得十分方便。元组非常适合函数需要返回多个值的情况,而这在其它语言里需要构造新的对象来实现。
元组的定义语法为 ( Type1, Type2, Type3 ),如
let aTuple = (1, “Yes”)
默认情况下,元组成员的访问以从0开始的下标方式,如 aTuple.0 取出 1,aTuple.1 取出 ”Yes”。可以为元组定义成员描述,如:
let aTuple = (aNumber:1, aString:”Yes”)
此时可由 aTuple.aNumber, aTuple.aString 访问指定成员。
~ 待续 ~