從Objective-C到Swift——Swift糖果(1)

來源:互聯網
上載者:User

Swift帶來很多確實很棒的特性,使得很難再回到Objective-C。主要的特性是安全性,不過這也被看成是一種額外副作用。

帶類型介面的強型別

Swift有強型別,這意味著除非你要求,不然Swift不會為你做類型之間的轉換。所以,例如你無法把Int型賦給Double型。你不得不首先轉換類型:

 
  1. let i: Int = 42 
  2. let d: Double = Double(i) 

或者你必須給Double類擴充一個方法用來轉換Int型:

 
  1. extension Double { 
  2.         func __convert(i: Int) -> Double { 
  3.             return Double(i) 
  4.         } 
  5.     } 
  6.     let another_d: Double = i 

強型別對於安全性是非常非常有利的。但是,如果它沒有為你給類型介面添加許多類型資訊的話,它也可能變成有一點令人生畏的事情,有點像是在寫指令碼語言。

 
  1. let ary = ["Hello", "world"] // NOTE: 'ary' is of type String[] or Array<String> 
  2.     for s in ary { // NOTE: 's' is of type String 
  3.         print(s + " ") 
  4.     } 

如果你想要建立一個包含很多類型(無共同祖先)的數組,你應該用枚舉(它可以包含值,見如下)。如果你想要它能夠包含所有值,你可以用Any型。如果想讓它包含任何Objective-C的類型,那就用AnyObject型。

請注意類型介面不會在申明函數的時候為你添加類型。你必須明確地說明你所申明函數的類型。

Blocks

Swift 中的Blocks很像Objective-C中的Blocks, 不過有兩點不同: 類型推斷和避免weakify dance.

對於類型推斷,你不必每次寫block時都包含完整類型資訊:

 
  1. sort([2,1,3], { 
  2.         (a: Int, b: Int) -> Bool in return a < b 
  3.     }) 
  4.       
  5.     // Using Type Inference 
  6.     // Using the Trailing Closures feature 
  7.       
  8.     sort([2,1,3]) { 
  9.         a, b in return a < b 
  10.     } 
  11.       
  12.     // Implicit 'return' for single-expression blocks 
  13.       
  14.     sort([2,1,3]) { a,b in a<b } 
  15.       
  16.     // Shorthand Argument Names 
  17.       
  18.     sort([2,1,3]) { $0 < $1 } 
  19.       
  20.     // Operators are functions, and functions are blocks too! 
  21.       
  22.     let sorted: Int[] = sort([2,1,3], <) 

訪問 Closures 瞭解更多blocks資訊。

除此之外,Objectvie-C 的weakify dance有點容易,只需在block的開始處加上  [unowned self] 或 [weak self]  即可。

 
  1. class CallbackTest { 
  2.         var i = 5 
  3.         var callback: (Int -> ())? // NOTE: The optional callback takes an Int 
  4.         deinit { // NOTE: This is like -dealloc in Objective-C 
  5.             println("Deinit") 
  6.         } 
  7.     } 
  8.       
  9.     var obj = CallbackTest() 
  10.     obj.callback = { 
  11.         [unowned obj] // NOTE: Without this, deinit() would never be invoked! 
  12.         a in 
  13.         obj.i = a 
  14.     } 

請注意Introduction post文章中介紹了Optional像上面的callback)。

請參考 ARC 章節來瞭解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.