Swift 2 有哪些新特性[譯]

在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, trycatch多個關(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)的:

  1. 為了創(chuàng)建一個錯誤可以拋出,只是創(chuàng)建一個繼承ErrorTypeenum
  2. 你需要使用throws關(guān)鍵字來標志任何函數(shù)可以拋出一個錯誤。
  3. 這里拋出一個錯誤,它將會在section 4中被捕捉。
  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 frogpants在作用域內(nèi)被unwrap。

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

注意: 如果你仍然不明白為什么使用guard語句比if-else語句更加有用,請查看Swift團隊Eric Cerney‘s postSwift 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)體添加新的方法到StringArray,但現(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)使用mapfilter,你可能也認為以方法的方式比全局函數(shù)來使用它們更好。多虧了強大的協(xié)議擴展,已經(jīng)有一些新的方法添加到集合類型,例如:mapfilterindexOf和更多!

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哪部分最令你興奮?哪部分你想我們第一時間報道?在下面評論讓我們知道!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內(nèi)容

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