標籤:
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 這種參考型別,表達的是null 指標的含義,含義上與 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 訪問指定成員。
~ 待續 ~
Swift 簡明參考