Swift 2 有哪些新特性[譯]

jopen 9年前發布 | 20K 次閱讀 Swift 2

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

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

Swift 2 有哪些新特性[譯]

錯誤處理

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

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

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

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

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

// 1
enum DrinkError: ErrorType {
  case NoBeerRemainingError
}

// 2 func drinkWithError() throws { if beer.isAvailable() { // party! } else { // 3 throw DrinkError.NoBeerRemainingError } }

func tryToDrink() { // 4 do { try drinkWithError() } catch { print("Could not drink beer! :[") return } }</pre>

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

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

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

Swift 2 有哪些新特性[譯]

綁定

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

if let pants = pants, frog = frog {
  // good stuff here!
}

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

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

guard let pants = pants, frog = frog else {
  // sorry, no frog pants here :[
  return
}

// at this point, frog and pants are both unwrapped and bound!</pre>

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

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

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

協議擴展

面向對象編程?函數式編程?Swift其實還是一種面向協議的編程語言!

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

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

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)")</pre>

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

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

et numbers = [1, 5, 6, 10, 16, 42, 45]

// Swift 1 find(filter(map(numbers, { $0 * 2}), { $0 % 3 == 0 }), 90)

// Swift 2 numbers.map { $0 * 2 }.filter { $0 % 3 == 0 }.indexOf(90) // returns 2</pre>

多虧了協議一致性,你的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哪部分最令你興奮?哪部分你想我們第一時間報道?在下面評論讓我們知道!

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!