Swift 2 有哪些新特性[譯]

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

我們將會為你編寫和錄制很多關于Swift 2的教程,但在此期間我想強調Swift最令人興奮的改變,為你可以在秋天遷移到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
  }
}

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

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

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

綁定

在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!

使用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)")

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

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 更多優秀譯文請關注我們的微信公眾號:learnSwift 原文鏈接:Friday Q&A 2015-06-19: ...
    梁杰_numbbbbb閱讀 4,968評論 3 34
  • Swift 介紹 簡介 Swift 語言由蘋果公司在 2014 年推出,用來撰寫 OS X 和 iOS 應用程序 ...
    大L君閱讀 3,292評論 3 25
  • 基礎部分(The Basics) 當推斷浮點數的類型時,Swift 總是會選擇Double而不是Float。 結合...
    gamper閱讀 1,332評論 0 7
  • 一直沒有時間好好看一下swift,最近復習了一遍語法,這里記錄swift學習過程中遇到的一些問題和要點,和Obje...
    bomo閱讀 2,394評論 0 25
  • 星期一早上,恐怕是醫院最繁忙擁擠的時段,我和曉梅理性的選擇特需門診就診。友誼醫院特需門診與的門診大樓一路之隔,是另...
    小白大亮閱讀 465評論 0 0