Swift 2.0 到底「新」在哪?

【編者按】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

Swift 2.0 到底「新」在哪?

在 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()方法,會看到以下輸出:

Swift 2.0 到底「新」在哪?

若是你想補充一個 awesomenessIndex 屬性來擴展 Awesom 協議,那麼可使用 awesomenessPercentage 方法的結果來計算 awesomeness 值。編碼以下:

extension Awesome {
    var awesomenessIndex: Int {
        get {
            return Int(awesomenessPercentage() * 100)
        }
    }
}

在協議中建立擴展,全部遵循 Awesome 協議的類都能訪問 awesomenessIndex 屬性。

Swift 2.0 到底「新」在哪?

的確很炫酷,是吧?

##可用性檢查

開發者都知道,構建應用須要時時與不一樣 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 官方博客

相關文章
相關標籤/搜索