從ShareSlide的開發看Swift語言
原文 http://www.infoq.com/cn/news/2015/06/swift-experience-share-slide
作為蘋果公司推出的iOS和OS X應用程序編寫語言, Swift 已經走過了一年的路程。因其安全的編程模式以及一些新獨特的功能,Swift語言受到了蘋果應用開發人員的關注。但是,究竟這門新的編程語言使用感受如何呢?在蘋果全球開發者大會(WWDC 2015)召開之前, SlideShare移動應用 的軟件開發工程師 Kyle Sherman分享了自己的一些心得體會 。
在Swift發布以后,SlideShare團隊在第一時間就開始研究這門新的語言,并在4個月后發布了SlideShare的1.0.0版本。 當時,這是蘋果商店中少數幾個使用Swift開發的軟件之一。目前,SlideShare已經歷經11次升級,到了1.6版本。首先,Kyle說明了 SlideShare團隊使用Swift的原因。簡單而言,使用Swift是因為其與Objective-C之間良好的互操作性、獨特的語法特性以及安全 的編程模式。尤其是良好的互操作性保證了使用由Objective-C編寫的LinkedIn框架以及一些開源的第三方源代碼的便捷性。
此外,Swift與 Ruby 或者 Python 這樣的腳本語言語法類似,保證了SlideShare團隊可以迅速上手。而且,作為一個升級如此頻繁的軟件的開發人員,kyle表示Swift語言的迅速變化完全不是問題。因此, SlideShare的工程經理Francisco Meza表示 使用Swift帶來了諸多好處。除了自定義的一個子類、一些開源的庫、LinkdedIn內部的開發庫以及一個內部的Core Data接口等,SlideShare絕大部分代碼都采用了Swift進行編寫。
接下來,Kyle詳細講述了Swift的諸多優點。在與Objective-C的互操作性方面,Swift用戶在橋接的位置添加一個頭文件就可滿 足大部分情況的需求。只是在使用NSDictionary以及C或者Objective-C創建的枚舉時,用戶需要特別注意。至于Swift的語法與特性 方面。相比于Objective-C或者C++,Swift去掉了一些不方便的語法約束。例如,在Swift中存在一個與C/Objective-C中的 block功能很像的概念——closure。但是,closure可以省略調用函數時的類型聲明以及return的書寫。這樣,代碼在保證易讀的同時將 會更加靈活和自然。
另外,Swift中的泛型代碼可以讓開發人員定義適用于任何類型的、靈活且可重用的函數和類型。目前,許多 Swift 標準庫都采用泛型代碼來構建。最后,作為Swift的一個重要特性,運算符重載允許用戶對現有的作用在特定的結構體和類上的操作符功能進行修改。雖然 SlideShare中還并沒有用到運算符重載,但Kyle表示早在使用Objective-C的時候,他就有使用該特性的需求。
Swift在安全方面所做的加強體現在以下幾個方面。
- Swift的可選類型會進行編譯檢查(如nil檢測等),防止一些常見的運行時錯誤。
- Swift的條件語句中循環/判斷條件不需要括號,但循環/判斷體(body)必需括號。這一特性可以有效的減少條件語句中因為語句所屬層次錯誤引起的bug。
- Swift初始化包括了很多過程。其中,兩段式構造過程的使用讓構造過程更安全,同時在整個類層級結構中給予了每個類完全的靈活性。而且,Swift 編譯器會執行四種有效的安全檢查,以確保兩段式構造過程能順利完成。
- Switch語句中每一個可能的值都必須要有一個case分支與之對應。而且,當匹配的 case 分支中的代碼執行完畢后,程序會直接終止switch語句。
- Swift不支持隱式類型轉換(Implicitly casting)。強制類型轉換使用is和as操作符實現。在as操作符后加一個“?”可以有效避免nil引起的程序崩潰。
- Swift中支持public、private、internal以及final等關鍵字,可以控制訪問方法或函數的權限。
當然,除了這些優點,SlideShare團隊也發現了Swift的一些缺點。這包括從單行表達式閉包中隱式返回結果可能會引起編譯錯誤、類中的函數無法 返回該類型的數據和函數/方法中的參數命名不清晰等。而且,Swift各個版本中也存在一些問題,諸如編譯時間較長且受CPU影響明顯、當 SourceKit崩潰時語法高亮也會失效、實時語法檢查有一定的延遲、 Xcode 升級時代碼也要相應的更新、代碼莫名的無法編譯或引起IDE/計算機崩潰。
不過,隨著Swift版本的升級,這些問題大部分都得到了一定程度的改善。最重要的是,Kyle他們在SlideShare開發過程中沒有遇到Swift語言本身引起的問題。