Swift帶來很多確實很棒的特性,使得很難再回到Objective-C。主要的特性是安全性,不過這也被看成是一種額外副作用。
帶類型介面的強型別
Swift有強型別,這意味著除非你要求,不然Swift不會為你做類型之間的轉換。所以,例如你無法把Int型賦給Double型。你不得不首先轉換類型:
- let i: Int = 42
- let d: Double = Double(i)
或者你必須給Double類擴充一個方法用來轉換Int型:
- extension Double {
- func __convert(i: Int) -> Double {
- return Double(i)
- }
- }
- let another_d: Double = i
強型別對於安全性是非常非常有利的。但是,如果它沒有為你給類型介面添加許多類型資訊的話,它也可能變成有一點令人生畏的事情,有點像是在寫指令碼語言。
- let ary = ["Hello", "world"] // NOTE: 'ary' is of type String[] or Array<String>
- for s in ary { // NOTE: 's' is of type String
- print(s + " ")
- }
如果你想要建立一個包含很多類型(無共同祖先)的數組,你應該用枚舉(它可以包含值,見如下)。如果你想要它能夠包含所有值,你可以用Any型。如果想讓它包含任何Objective-C的類型,那就用AnyObject型。
請注意類型介面不會在申明函數的時候為你添加類型。你必須明確地說明你所申明函數的類型。
Blocks
Swift 中的Blocks很像Objective-C中的Blocks, 不過有兩點不同: 類型推斷和避免weakify dance.
對於類型推斷,你不必每次寫block時都包含完整類型資訊:
- sort([2,1,3], {
- (a: Int, b: Int) -> Bool in return a < b
- })
-
- // Using Type Inference
- // Using the Trailing Closures feature
-
- sort([2,1,3]) {
- a, b in return a < b
- }
-
- // Implicit 'return' for single-expression blocks
-
- sort([2,1,3]) { a,b in a<b }
-
- // Shorthand Argument Names
-
- sort([2,1,3]) { $0 < $1 }
-
- // Operators are functions, and functions are blocks too!
-
- let sorted: Int[] = sort([2,1,3], <)
訪問 Closures 瞭解更多blocks資訊。
除此之外,Objectvie-C 的weakify dance有點容易,只需在block的開始處加上 [unowned self] 或 [weak self] 即可。
- class CallbackTest {
- var i = 5
- var callback: (Int -> ())? // NOTE: The optional callback takes an Int
- deinit { // NOTE: This is like -dealloc in Objective-C
- println("Deinit")
- }
- }
-
- var obj = CallbackTest()
- obj.callback = {
- [unowned obj] // NOTE: Without this, deinit() would never be invoked!
- a in
- obj.i = a
- }
請注意Introduction post文章中介紹了Optional像上面的callback)。
請參考 ARC 章節來瞭解