【編者按】2015年6月,一年一度的蘋果 WWDC 大會如期而至,在大會上蘋果發佈了 Swift 2.0,引入了不少新的特性,以幫助開發者更快、更簡單地構建應用。本篇文章做者是 Maxime defauw ,本文中 Maxime 向你們簡要介紹 Swift 2.0 中值得注意的新特性。本文系 OneAPM 工程師編譯整理。html
一年前,蘋果推出了面向 iOS 和 OS X 的全新編程語言—— Swift。當聽到它發佈的時候,像千千萬萬 iOS 開發者那樣,筆者的心裏激動無比。正如宣傳所說的那樣,做爲一門快速、安全的編程語言,Swift 已經成長爲最流行的編程語言之一。一年以後,蘋果不負衆望,在2015年的 WWDC 會議中推出了 Swift 2.0。做者有幸去了現場,因此在這裏向你們介紹一下 Swift 2.0 的新特性。編程
「今年,咱們將藉助 Swift 2.0 乘風破浪。咱們認爲 Swift 即將成爲最大的編程語言,而且成爲下個二十年最不可或缺的應用和系統編程語言。任何人在任何地方都能使用 Swift 」,蘋果公司軟件工程副總裁 Craig Federighi 說道。swift
在 WWDC 大會上,蘋果測量了分貝的新功能普及性。會議中兩次最大的掌聲,一次是蘋果宣佈 Xcode 7 支持 UI 測試,另外一次則是 Swift 的開源。若是你錯過 WWDC 的主題演講,或者最近生活得壓力山大,那麼請你再確認一下,你沒有看錯:Swift 真的開源了。這但是件大事!下半年,蘋果還將公開發布在 OSI 標準許可下的 Swift 的源代碼,包括編譯器和標準庫。蘋果也將開放 Linux 的源代碼端口,開發者將可以促進語言的發展,並在 Linux 上編寫 Swift 程序。由此看出,蘋果鼓勵開發者進一步推進 Swift 的發展。安全
隨着這一使人振奮的消息的發佈,Swift 2.0 涵蓋了更多新的功能,如升級的錯誤處理、協議擴展和可用性檢查。下面咱們就來看看這些新特性。app
##錯誤處理編程語言
程序總會出錯。當函數出現問題時,若是能找出哪裏出錯,便能理解爲何會出現異常。Swift 1.0 版本缺少有效的錯誤處理機制。在 Swift 2.0 中,開發者能夠利用 try / throw / catch 關鍵字,創建異常處理模式。ide
假設你正在加入汽車引擎模型。引擎可能因爲某些緣由致使失敗:函數
在 Swift 中,錯誤能夠看作符合 ErrorType 協議的類型值。在這種狀況下,你能夠建立立一個符合 ErrorType 的枚舉模型來表示錯誤情形:性能
enum CarEngineErrors: ErrorType { case NoFuel case OilLeak case LowBattery }
構造一個能夠拋出異常的函數,在聲明中使用 throws 關鍵字,以下例所示:學習
func checkEngine() throws { }
函數中拋出錯誤,你可使用 throw 聲明。下例代碼演示瞭如何對引擎錯誤進行簡單檢查:
let fuelReserve = 20.0 let oilOk = true let batteryReserve = 0.0 func checkEngine() throws { guard fuelReserve > 0.0 else { throw CarEngineErrors.NoFuel } guard oilOk else { throw CarEngineErrors.OilLeak } guard batteryReserve > 0.0 else { throw CarEngineErrors.LowBattery } }
guard 關鍵詞是 Swift 2.0 爲了加強控制流首次引用的。當執行到 guard 語句時,首先會檢查條件語句。若是條件爲 false,則 else 部分會被執行。以上代碼中,若是沒有條件符合,函數將會拋出異常。
爲了調用拋出函數,須要把 try 關鍵字放在函數調用以前。
func startEngine() { try checkEngine() }
若是在 Playgrounds 中寫入以上代碼,在處理異常以前已經出現錯誤。Swift 裏的錯誤處理機制,須要使用 do-catch 語句來抓取異常並進行恰當處理。
下面的函數指定了捕獲異常後的響應:
func startEngine() { do { try checkEngine() print("Engine started", appendNewline: true) } catch CarEngineErrors.NoFuel { print("No Fuel!") } catch CarEngineErrors.OilLeak { print("Oil Leak!") } catch CarEngineErrors.LowBattery { print("Low Battery!") } catch { // Default print("Unknown reason!") } }
每一個 catch 從句都匹配特定的錯誤,而且指定相關錯誤的響應機制。在上面的例子中,batteryReserve 變量被置爲0,這種狀況下調用 startEngine()將會拋出 .LowBattery 異常。
假如把 batteryReserve 重置爲 1.0,這樣就沒有異常拋出,窗口打印「Engine started」的提示信息。
相似於 switch 語句,Swift 2 的錯誤處理機制是完備的,你須要考慮到全部可能的錯誤狀況。因此咱們須要包含一個不指定類型的 catch 從句。
若是須要了解更多 Swift 的錯誤處理機制,推薦你們參考 Apple Documentation。
##println()函數缺席
在做者寫這篇介紹時,他注意到 println()函數的缺席。在 Swift 2.0 中,咱們只需 print()函數便能打印到輸出窗口。蘋果公司將 println()和 print()函數合二爲一。若是你想隔行輸出,能夠將 appendNewline 參數設爲 true。以下面代碼所示:
print("Engine started", appendNewline: true)
##協議擴展
在老版 Swift 中,你可使用擴展爲現有的類、結構或枚舉添加新功能。Swift 2.0 容許開發者應用擴展到協議類型。隨着協議的擴展,你能夠經過添加一個特定協議,爲全部類添加函數或屬性,也便於擴展協議的功能。
以下例所示,建立一個新協議並命名爲 Awesome。該協議能夠由任何能返回特定對象的 awesomeness 指數百分比的類型來實現。
protocol Awesome { func awesomenessPercentage() -> Float }
如今聲明兩個遵照新協議的類。每一個類都實現了 Awesome 協議的指定方法:
class Dog: Awesome { var age: Int! func awesomenessPercentage() -> Float { return 0.85 } } class Cat: Awesome { var age: Int! func awesomenessPercentage() -> Float { return 0.45 } } let dog = Dog() dog.awesomenessPercentage() let cat = Cat() cat.awesomenessPercentage()
在 Playground 中初始化該類並調用 awesomenessPercentage()方法,會看到以下輸出:
若是你想補充一個 awesomenessIndex 屬性來擴展 Awesom 協議,那麼可使用 awesomenessPercentage 方法的結果來計算 awesomeness 值。編碼以下:
extension Awesome { var awesomenessIndex: Int { get { return Int(awesomenessPercentage() * 100) } } }
在協議中建立擴展,全部遵循 Awesome 協議的類都能訪問 awesomenessIndex 屬性。
的確很炫酷,是吧?
##可用性檢查
開發者都知道,構建應用須要時時與不一樣 iOS 版本作鬥爭。你老是但願使用最新版的 API,但有時應用舊版本的 iOS 上運行時容易出錯,這可能會致使 Bug。在 Swift 2.0 以前,沒有標準方式來進行可用性檢查。好比:NSURLQueryItem 類在 iOS 8 上纔可用,若是在 iOS 之前的版本中使用則會出錯,甚至會致使應用崩潰。爲了不這種錯誤,你能夠按照如下代碼執行可用性檢查:
if NSClassFromString("NSURLQueryItem") != nil { // iOS 8 or up } else{ // Earlier iOS versions }
這是檢查類是否存在的一種方式。從 Swift 2 開始支持 API 在不一樣版本下的可用性檢查。你能夠簡單定義一個可用性條件,因此相應的代碼塊只能在特定的 iOS 版本下執行,舉例以下:
if #available(iOS 8, *) { // iOS 8 or up let queryItem = NSURLQueryItem() } else { // Earlier iOS versions }
##do-while 更改成 repeat-while
經典的 do-while 循環現更名爲 repeat-while,請參考下例:
var i = 0 repeat { i++ print(i) } while i < 10
##總結
但願你們能喜歡這篇關於 Swift 2.0 的介紹。還有不少內容沒有涵蓋到,好比 Markdown 格式的註釋等。更多詳情能夠參考 this WWDC video。寫到這兒,不少公司還在使用 Objective-C 做爲構建 iOS 應用的主要編程語言,極可能你也是。但做者仍堅信 Swift 的發展前景更爲廣闊。事實上,2015年 WWDC上全部重要會議都在使用 Swift,若是你尚未學習 Swift,是時候採起行動了!
你能夠在此下載本篇文章的 Playground 文件。確保使用 Xcode 7運行的代碼,這是惟一支持 Swift 2.0 的 Xcode 版本。Xcode 7 目前仍處於測試階段。你能夠從蘋果官網上下載。
原文地址:What’s New in Swift 2.0: A Brief Introduction
OneAPM 是應用性能管理領域的新興領軍企業。Mobile Insight 能以用戶真實使用感覺爲度量標準,檢測每次崩潰的發生,協助監控移動應用性能。想閱讀更多技術文章,請訪問 OneAPM 官方博客。