2021-05-12 14:32:11
Swift 2.0 簡要介紹
看了很多篇介紹 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
相關文章