- 原文鏈接 : What’s New in Swift 2
- 原文作者 : Greg Heo
- 譯文出自 : 開發(fā)技術(shù)前線 www.devtf.cn
- 譯者 : Sam Lau
- 校對者: Mr.Simple
- 狀態(tài) : 校正完
在WWDC我們發(fā)現(xiàn)Swift團隊沒有浪費時間在無謂的地方,而是致力于改善Swift 2。
我們將會為你編寫和錄制很多關(guān)于Swift 2的教程,但在此期間我想強調(diào)Swift最令人興奮的改變,為你可以在秋天遷移到Swift 2做準備。

錯誤處理
正如Ray在WWDC 2015 Initial Impressions文章中提及,錯誤處理已經(jīng)在Swift 2改進了。我們已經(jīng)遷移到新的系統(tǒng)就像異常處理,而不是NSError對象和雙指針。
你可能對以下代碼比較熟悉:
if drinkWithError(nil) {
print("Could not drink beer! :[")
return
}
一般在Cocoa,你傳入一個NSError對象的引用(一個inout參數(shù)在Swift),然后方法會賦值給錯誤變量。但問題是你可以傳入一個nil到這里來完全忽略這個錯誤;或者,你可以傳入NSError但從不檢查它。
Swift 2 為錯誤檢查添加額外保護層。你可以使用throws關(guān)鍵字來指定那個函數(shù)和方法能夠拋出一個錯誤。然后當你調(diào)用某樣東西時,可以用do, try和catch多個關(guān)鍵字來捕捉和處理錯誤。
// 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
}
}
這里有幾樣東西需要強調(diào)的:
- 為了創(chuàng)建一個錯誤可以拋出,只是創(chuàng)建一個繼承ErrorType的enum。
- 你需要使用throws關(guān)鍵字來標志任何函數(shù)可以拋出一個錯誤。
- 這里拋出一個錯誤,它將會在section 4中被捕捉。
- 你在一個do塊中包含任何可以拋出一個錯誤的代碼,而不是其他語言類似的try塊中。然后,你添加一個try關(guān)鍵字到函數(shù)被調(diào)用的前面,而且這個函數(shù)能夠拋出一個錯誤。
新語法是非常簡潔和易讀。任何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意味著你可以執(zhí)行optional binding (或其他操作)和如果條件失敗就提供一個代碼塊在else運行。然后,你可以繼續(xù)執(zhí)行。在這種情況下,optionals frog和pants在作用域內(nèi)被unwrap。
使用guard指定某種你希望得到狀態(tài)而不是檢查錯誤情況之后,使代碼更加簡潔。
注意: 如果你仍然不明白為什么使用guard語句比if-else語句更加有用,請查看Swift團隊Eric Cerney‘s post在Swift guard statement。
協(xié)議擴展
面向?qū)ο缶幊蹋亢瘮?shù)式編程?Swift其實還是一種面向協(xié)議的編程語言!
在Swift 1,協(xié)議就像接口一樣可以指定一些屬性和方法,然后類,結(jié)構(gòu)體或枚舉會遵循它。
現(xiàn)在在Swift 2,你可以擴展協(xié)議和給屬性和方法添加默認實現(xiàn)。你之前已經(jīng)可以在類或結(jié)構(gòu)體添加新的方法到String或Array,但現(xiàn)在你可以添加這些到協(xié)議,這讓你更加廣泛地應(yīng)用。
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協(xié)議現(xiàn)在被命名為CustomStringConvertible,而大多數(shù)的Foundation對象都遵循Printable協(xié)議。有了協(xié)議擴展之,你可以用自定義功能來擴展系統(tǒng)。相比于向很多類、結(jié)構(gòu)體和枚舉添加少量的自定義代碼,你可以編寫一個通用實現(xiàn),然后應(yīng)用到不同的數(shù)據(jù)類型。
Swift團隊已經(jīng)忙著做這個了 - 如果你在Swift已經(jīng)使用map或filter,你可能也認為以方法的方式比全局函數(shù)來使用它們更好。多虧了強大的協(xié)議擴展,已經(jīng)有一些新的方法添加到集合類型,例如: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
多虧了協(xié)議一致性,你的Swift 2代碼會變得更加簡潔和易讀。在Swift 1版本,你需要查看調(diào)用函數(shù)內(nèi)部來理解它的工作原理;在Swfit 2版本,函數(shù)鏈會變得清晰。
如果你打算使用面向協(xié)議編程 - 請查看WWDC session on this topic和留意這個網(wǎng)站的教程和文章。
匯總
在WWDC大會中發(fā)布很多東西,所以我想強調(diào)幾樣重要的東西:
Objective-C 泛型 - Apple已經(jīng)開始標注所有的Objective-C代碼以便Swift類型能夠獲取正確類型的optional。使用Objective-C泛型也能正常工作,這樣給Swift開發(fā)者更好的類型提示。如果你希望出現(xiàn)一些UITouch對象或字符串數(shù)組,那就會出現(xiàn)你想要的而不是一些AnyObjects。
重命名 語法 - println已經(jīng)離開我們一年了;現(xiàn)在它是普通舊的print,現(xiàn)在它有第二個參數(shù)的默認值設(shè)置為true來決定是否換行。do關(guān)鍵字主要用來錯誤處理,do-while循環(huán)現(xiàn)在是使用repeat-while。類似地,有很多協(xié)議名都改變了,例如:Printable改為CustomStringConvertible。
Migrator - 有很多小的語法改變,你怎樣使得你代碼變得最新?Swift 1-to-2 migrator會將代碼變成最新的標準和改變語法。這個migrator智能到能夠更新你的代碼使用新的錯誤處理,和更新塊注釋到新的格式風格!
開源! - 對碼農(nóng)有一個重大消息就是在秋天發(fā)布Swift 2的時候,Swift將會開源!這意味著不僅可以使用它來iOS開發(fā),更重要的是學習它的源代碼。不僅如此,這將是很好的機會來深入源代碼,甚至為項目貢獻代碼,然后在swift編譯器提交歷史上留下你的名字。
下一步
這只是所有發(fā)布特性中的一些簡單示例;想了解更多,請查看WWDC session videos和已更新的Swift Programming Language book
如果還有一些人記得在Swift第一個beta版和發(fā)布的1.0之間有很多改變,那么將來肯定會有更多地特性出現(xiàn)。我們團隊將會持續(xù)關(guān)注所有的更新,深入挖掘令人興奮的改變,所以請密切留意教程,書籍和視頻。
Swift 2哪部分最令你興奮?哪部分你想我們第一時間報道?在下面評論讓我們知道!