歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Swift 2.0 簡要介紹

Swift 2.0 簡要介紹

日期:2017/2/28 14:00:35   编辑:Linux教程

看了很多篇介紹 Swift 2.0 的,感覺 Appcoda 這篇介紹的比較清楚,順手學習並翻譯了一下,英文原文看 這裡.

What’s New in Swift 2.0: A Brief Introduction

一年前,Apple 為 iOS 和 OSX 開發者帶來了全新的編程語言 Swift,當蘋果的副總裁在WWDC上宣布的那一剎那,我和很多開發者一樣,異常興奮。作為宣傳中更快、更安全的語言,Swift 已經成長為目前最流行的語言了。在今年的 WWDC 上 Apple 推出了 Swift 2,我很幸運能參加這次 WWDC 大會,下面我分享一些新版 Swift 的更新。

We’re stepping on the gas this year with Swift 2. We think Swift is the next big programming language, the one we will all do application and systems programming on for 20 years to come. We think it should be everywhere and used by everyone.

Craig Federighi, Apple’s senior vice president of Software Engineering

我在 WWDC 會場注意到兩次最大的掌聲,一次是 Apple 宣布 Xcode 7 支持 UI testing,另一次就是 Swift 將開放源代碼,後者將是一件大事件,今年晚些時候,Apple 將開發 Swift 的源代碼給公眾,包括編譯器和一些基本庫,這些都將在 OSI-compliant license 之下。蘋果同樣也將讓 Swift 支持 Linux,開發者可以使用 Swift 來寫系統應用了。這說明,蘋果終於開始下功夫推動這門新生語言的發展了。

除去這些激動人心的新聞,Swift 2 介紹了一些新的功能,例如錯誤處理(error handling),協議擴展(protocol extensions)和可用性檢查(availability check),下面我們來詳細介紹下。

Error Handling

程序總會出錯,當函數出錯時,如果能找出哪裡出錯了,有助於理解為什麼會失敗。Swift 版本 1 缺乏合適的錯誤處理模式,在 Swift 2,終於加入了異常處理模式,使用 try / throw / catch 關鍵字。

想象一下有一輛汽車發動機,引擎會因為如下原因啟動失敗:

  • 沒油了(No fuel)
  • 漏油了(Oil leakage)
  • 電量低(Low battery)

在 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 為了增強控制流(control flow)推出的。當執行到控制分支 guard 語句,首先會檢查後面緊跟的條件語句,如果條件為假,則 else 部分將會被執行,上面的例子中條件為假會執行 throw 語句拋出異常。

要調用 throwing function,你需要將 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,這樣汽車發動時就沒有任何錯誤了。

類似於 switch 語句,Swift 2 的錯誤處理模型也是要求完備的,意味著你必須要處理全部可能的錯誤。這就是為什麼我們要包含最後一個不帶任何匹配模式的 catch

如果你想學習更多的關於 Swift 的錯誤處理,我推薦你去讀 Apple 的官方文檔

No More println()

看到這裡,你可能已經注意到了 println() 函數不見了,在 Swift 2 中,我們只能使用 print() 來打印輸出。Apple 將 println()print() 合二為一。如果你想在新的一行打印,你可以設置 appendNewline 參數為 true

print("Engine started", appendNewline: true)

Protocol Extensions

在第一版 Swift 中,你可以使用 extensions 為現有類、結構體、枚舉類型添加新的功能。Swift 2 允許開發者將 extensions 帶到了 protocol 類型上。通過 Protocol Extensions,你可以為遵守某個協議的類添加 properties 或 functions。當你想要擴展 protocol 的功能時將會變得非常有用。

還是通過一個例子來說明一下吧,創建一個 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 中演示,將會得到如下輸出:

假如你想要為 Awesome 協議添加一個 awesomenessIndex 屬性,我們將使用 awesomenessPercentage() 方法來計算 awesomeness 索引:

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

通過在 protocol 上創建 extension,所有遵循該協議的類都將可以立即訪問 awesomenessIndex 索引了。

是不是很美妙 O(∩_∩)O~~

Availability Checking

每個開發者都要構建 App 的時候都要和不同的 iOS 版本做斗爭。你總是希望使用最新的 API,但是當 APP 運行咋愛老版本 iOS 上的時候,會產生一些錯誤。在 Swift 2之前,沒有一種可以進行 iOS 版本堅持的方式,比如 NSURLQueryItem 類只有在 iOS 8 上才能使用,如果你在之前的 iOS 版本中使用,會立即得到一個錯誤並且 crash 掉,為了預防這種事件的發生,你可以執行如下檢查:

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 is now repeat-while

經典的 do-while 循環現在被重命名為 repeat-while,貌似語意更加清晰了:

var i = 0
repeat {
    i++
    print(i)
} while i < 10

Summary

我希望你能很高興地去閱讀一下 Swift 2 的官方簡介,這裡有很多我這篇文章沒有提到的內容,比如 Markdown 格式的注釋等,你也可以去觀摩 WWDC 視頻 去學習更多 Swift 2 的內容。在此刻,仍然有相當多的公司將 Objective-C 作為 iOS 開發的主力語言,或許你也正使用 OC。但我強烈地相信 Swift 才是未來之路。事實上,WWDC 2015 所有的 sessions 都在使用 Swift,所以如果你還沒有學習 Swift,現在就開始行動吧。

你可以下載這篇文章的 Playground file 代碼,請確保用 Xcode 7 運行哦,因為這是唯一支持 Swift 2.0 的 Xcode 版本。

Apple Swift學習教程 http://www.linuxidc.com/Linux/2014-09/106420.htm

使用 Swift 構建一個 iOS 的郵件應用 http://www.linuxidc.com/Linux/2014-08/105542.htm

Swift 2.0開源化 http://www.linuxidc.com/Linux/2015-06/118594.htm

Swift 的詳細介紹:請點這裡

Copyright © Linux教程網 All Rights Reserved