Swift 2 有哪些新特性

來源:互聯網
上載者:User

標籤:

在WWDC我們發現Swift團隊沒有浪費時間在無謂的地方,而是致力於改善Swift 2。

我們將會為你編寫和錄製很多關於Swift 2的教程,但在此期間我想強調Swift最令人興奮的改變,為你可以在秋天遷移到Swift 2做準備。

錯誤處理

正如Ray在WWDC 2015 Initial Impressions文章中提及,錯誤處理已經在Swift 2改進了。我們已經遷移到新的系統就像異常處理,而不是NSError對象和雙指標。

你可能對以下代碼比較熟悉:

     Objective-C 
1234 if drinkWithError(nil) {  print("Could not drink beer! :[")  return}

Swift 2 為錯誤檢查添加額外保護層。你可以使用throws關鍵字來指定那個函數和方法能夠拋出一個錯誤。然後當你調用某樣東西時,可以用do, try和catch多個關鍵字來捕捉和處理錯誤。

一般在Cocoa,你傳入一個NSError對象的引用(一個inout參數在Swift),然後方法會賦值給錯誤變數。但問題是你可以傳入一個nil到這裡來完全忽略這個錯誤;或者,你可以傳入NSError但從不檢查它。

     Objective-C 
123456789101112131415161718192021222324 // 1enum DrinkError: ErrorType {  case NoBeerRemainingError} // 2func drinkWithError() throws {  if beer.isAvailable() {    // party!  } else {    // 3    throw DrinkError.NoBeerRemainingError  }} func tryToDrink() {  // 4  do {    try drinkWithError()  } catch {    print("Could not drink beer! :[")    return  }}

 

這裡有幾樣東西需要強調的:

  1. 為了建立一個錯誤可以拋出,只是建立一個繼承ErrorType的enum。
  2. 你需要使用throws關鍵字來標誌任何函數可以拋出一個錯誤。
  3. 這裡拋出一個錯誤,它將會在section 4中被捕捉。
  4. 你在一個do塊中包含任何可以拋出一個錯誤的代碼,而不是其他語言類似的try塊中。然後,你添加一個try關鍵字到函數被調用的前面,而且這個函數能夠拋出一個錯誤。

新文法是非常簡潔和易讀。任何API當前使用NSError以後都會使用這種錯誤處理方式。

綁定

在Swift 1.2,我們失去了金字塔的厄運和能夠在一行代碼測試多個綁定的optionals:

     Objective-C 
123 if let pants = pants, frog = frog {  // good stuff here!}

這樣勉強能夠工作,但對於有些人需要縮排那個嵌套著很多optionals才能訪問的值的“首選”的代碼路徑是一個問題。這意味著你需要深入查看縮排主線部分的代碼塊,而錯誤條件卻在外面。

如果有些方式來檢查一些沒有值的optionals,然後早點退出。這正是Swift 2提供的guard語句:

     Objective-C 
123456 guard let pants = pants, frog = frog else {  // sorry, no frog pants here :[  return} // at this point, frog and pants are both unwrapped and bound!

 

使用guard意味著你可以執行optional binding (或其他動作)和如果條件失敗就提供一個代碼塊在else運行。然後,你可以繼續執行。在這種情況下,optionals frog和pants在範圍內被unwrap。

使用guard指定某種你希望得到狀態而不是檢查錯誤情況之後,使代碼更加簡潔。

注意: 如果你仍然不明白為什麼使用guard語句比if-else語句更加有用,請查看Swift團隊Eric Cerney‘s post在Swift guard statement。

協議擴充

物件導向編程?函數式編程?Swift其實還是一種面向協議的程式設計語言!

在Swift 1,協議就像介面一樣可以指定一些屬性和方法,然後類,結構體或枚舉會遵循它。

現在在Swift 2,你可以擴充協議和給屬性和方法添加預設實現。你之前已經可以在類或結構體添加新的方法到String或Array,但現在你可以添加這些到協議,這讓你更加廣泛地應用。

     Objective-C 
12345678910111213 extension CustomStringConvertible {  var shoutyDescription: String {    return "\(self.description.uppercaseString)!!!"  }} let greetings = ["Hello", "Hi", "Yo yo yo"] // prints ["Hello", "Hi", "Yo yo yo"]print("\(greetings.description)") // prints [HELLO, HI, YO YO YO]!!!print("\(greetings.shoutyDescription)")

注意Printable協議現在被命名為CustomStringConvertible,而大多數的Foundation對象都遵循Printable協議。有了協議擴充之,你可以用自訂功能來擴充系統。相比於向很多類、結構體和枚舉添加少量的自訂代碼,你可以編寫一個通用實現,然後應用到不同的資料類型。

 

Swift團隊已經忙著做這個了 – 如果你在Swift已經使用map或filter,你可能也認為以方法的方式比全域函數來使用它們更好。多虧了強大的協議擴充,已經有一些新的方法添加到集合類型,例如:map,filter,indexOf和更多!

     Objective-C 
1234567 et numbers = [1, 5, 6, 10, 16, 42, 45] // Swift 1find(filter(map(numbers, { $0 * 2}), { $0 % 3 == 0 }), 90) // Swift 2numbers.map { $0 * 2 }.filter { $0 % 3 == 0 }.indexOf(90) // returns 2

多虧了協議一致性,你的Swift 2代碼會變得更加簡潔和易讀。在Swift 1版本,你需要查看調用函數內部來理解它的工作原理;在Swfit 2版本,函數鏈會變得清晰。

如果你打算使用面向協議編程 – 請查看WWDC session on this topic和留意這個網站的教程和文章。

匯總

在WWDC大會中發布很多東西,所以我想強調幾樣重要的東西:

  • Objective-C 泛型 – Apple已經開始標註所有的Objective-C代碼以便Swift類型能夠擷取正確類型的optional。使用Objective-C泛型也能正常工作,這樣給Swift開發人員更好的類型提示。如果你希望出現一些UITouch對象或字串數組,那就會出現你想要的而不是一些AnyObjects。
  • 重新命名 文法 – println已經離開我們一年了;現在它是普通舊的print,現在它有第二個參數的預設值設定為true來決定是否換行。do關鍵字主要用來錯誤處理,do-while迴圈現在是使用repeat-while。類似地,有很多協議名都改變了,例如:Printable改為CustomStringConvertible。
  • Migrator – 有很多小的文法改變,你怎樣使得你代碼變得最新?Swift 1-to-2 migrator會將代碼變成最新的標準和改變文法。這個migrator智能到能夠更新你的代碼使用新的錯誤處理,和更新塊注釋到新的格式風格!
  • 開源! – 對碼農有一個重大訊息就是在秋天發布Swift 2的時候,Swift將會開源!這意味著不僅可以使用它來iOS開發,更重要的是學習它的原始碼。不僅如此,這將是很好的機會來深入原始碼,甚至為項目貢獻代碼,然後在swift編譯器提交曆史上留下你的名字。
下一步

這隻是所有發布特性中的一些簡單樣本;想瞭解更多,請查看WWDC session videos和已更新的Swift Programming Language book

如果還有一些人記得在Swift第一個beta版和發布的1.0之間有很多改變,那麼將來肯定會有更多地特性出現。我們團隊將會持續關注所有的更新,深入挖掘令人興奮的改變,所以請密切留意教程,書籍和視頻。

Swift 2哪部分最令你興奮?哪部分你想我們第一時間報道?在下面評論讓我們知道!

Swift 2 有哪些新特性

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.