Swift vs Objective-C:未來看好 Swift 的十個理由

oschina發表於2015-05-14

是時候使用易入手又全面的Swif語言為iOS和mac OS X做應用開發了。

雖然程式語言不會那麼容易消逝,但堅持衰落範例的開發小組正在這麼做。如果你正為移動裝置開發應用程式,並且你還沒有研究Swift,那麼注意:當Swift涉及到Mac、iPhone、ipad、Apple Watch和未來裝置的應用開發時,它不僅會排擠掉Objective-C,而且還會取代在Apple平臺中做嵌入式開發的C語言。

由於幾個關鍵特性,在未來幾年,Swift有很大潛力成為創造身臨其境的、響應迅速的、面向使用者的應用程式的實際程式語言。

蘋果公司似乎在Swift上還有更大的目標。它的編譯器效能和開發語言都被優化了,蘋果公司在Swift的文件中暗示Swift被設計成小能(顯示)“hello,world”,大能(完成)整個作業系統。蘋果公司還沒把這門語言的目標說全,Xcode6,Playgrounds和Swift的推出就一起揭露蘋果的意圖:更簡單的應用開發,更易用的開發工具鏈。

這是從現在起使用Swift工作,並走在比賽前列的10個原因。

1. Swift 容易閱讀

如你所能預計到的一門基於 C 構建的語言,Objective-C 身上所有的毒疣子都有。為了將關鍵詞和型別同C的型別作區分,Objective-C 使用@符號引入了新的關鍵詞。因為 Swift 不是基於C構建的,它同意了所有的關鍵詞,並將 Objective-C 型別和物件相關的關鍵詞前面大量的@符號移除了.

Swift 丟棄了遺留下來的約定。因而你不再需要行尾的分號,以及 if/else 語句中圍繞條件表示式的括弧。另外一個大變化就是方法的呼叫不再互相巢狀成中括號的深坑 — 再見吧,[[[ ]]]。Swift 中的方法和函式的呼叫使用行業內標準的在一對括弧內使用逗號分隔的引數列表。這樣做的結果就是一種帶有簡化了句法和語法的更加乾淨有表現力的語言。

除了其它當代流行的程式語言之外,Swift 更像是自然的英語了。這種可讀性是的其很容易能被其它來自 JavaScript,Java,Python,C#,以及 C++ 的開發者納入到他們的工具鏈之中 — 一點也不像 Objective-C 這隻笨笨的黃小鴨。

2. Swift 更易於維護

歷史遺留問題會讓 Objective-C 越來越倒退 — C 沒有演進的話,這個語言也就跟著無法進行演進。C 需要程式設計師維護兩套程式碼檔案,以優化構建的時間以及建立可執行 app 的效率, 這種需要延續到了 Objective-C 上。

Swift 丟掉了對著倆檔案的要求。Swift1.2 中 Xcode 和 LLVM 編譯器可以自動計算出以來並執行增量構建。如此,將內容清單 (標頭檔案) 同內容主體(實現檔案)相分離。Swift 將 Objective-C 標頭檔案(.h) 和實現檔案 (.m) 合併成了一個程式碼檔案 (.swift)。

Objective-C 的兩份檔案系統存在強加給程式設計師的額外工作 — 而這些工作會讓程式設計師難免分心而不能顧全大局. 在 Objective-C 中你不得不手動去同步檔案之間的方法名稱和註釋, 有時候要寄希望於一個約定好的標準,不過除非團隊的規矩和程式碼審查制度到位,否則這是不會為你提供什麼保障的.

Xcode 和 LLVM 編譯器可以在幕後做一些工作來減輕程式設計師的工作負擔. 使用 Swift, 程式設計師可以少做些費腦力的記憶性工作,從而能在建立app邏輯的工作上面贏得更多的時間. Swift 為我們程式設計師裁掉了那些樣板式的工作,同時對程式碼、註釋以及所要支援的特性的質量都有所提升.

3. Swift 更加安全

Objective-C 有意思的一個方面是指標 — 特別是 nil (null) 指標 — 它們被處理的方式. 在Objective中-C, 如果你呼叫方法的是一個值為 nil (未初始化)的指標變數,什麼事情都會不發生. 表示式或者一行操作變成了一項空操作(no-operation (no-op)), 而這就使得其看起來會有不會奔潰的好處, 但其實它已經變成了一個巨大的bug來源. no-op 會導致不可預測的行為, 這是程式設計師在嘗試找出並修復某種隨機的奔潰,或者要停止反常的行為時所要面對的敵人.

在Swift程式碼中的可選型別使得一個nil可選值的可能性變得非常的明確, 這意味它能在你寫下一段糟糕的程式碼時會生成一個編譯器錯誤. 這就建立了一種短程反饋的迴圈,可以讓程式設計師帶著目標去寫程式碼. 問題在程式碼被寫就時就可以被修復, 這大大節省了你要在修復有關來自 Objective-C 指標邏輯的bug時需要耗費的時間和金錢.

在 Objective-C 的傳統中, 如果某個值返回自一個方法, (使用註釋以及方法的命名約定來)說明指標變數被返回的行為是程式設計師的責任.在 Swift 中, 可選型別和值型別使得方法定義中值是否存在,或者其有可能是可選的(即值可能存在也可能為nil),這些問題都是很明確清楚的.

為了提供對行為的預測,Swift會在nil可選值被使用時觸發一次執行時崩潰。 崩潰提供的就是一種一致的行為,它能減輕修復bug過程的壓力,因為它會直白地強制讓程式設計師修復好這個問題. Swift 執行時崩潰的時候會停在nil可選值被使用到的那行程式碼處。這就意味著bug能更早的被修復,並能在Swift程式碼中被完全的規避掉.

4. Swift 的記憶體管理是統一化的

Swift 以一種 Objective-C 從未有過的方式進行了統一。對自動引用計數 (ARC) 的支援是在整個過程化的和麵向物件的程式碼路徑上完成的。在。Objective-C。中, ARC 在 Cocoa API 和麵向物件程式碼中獲得支援;然而它並不支援過程式的 C 語言程式碼和像 Core Graphics 這樣的 API。這意味著在使用 Core Graphics API 以及其它 iOS 上的底層 API 時,記憶體管控的處理都是程式設計師的責任。程式設計師在 Objective-C 上會遇到的大量記憶體溢位問題在 Swift 上是不可能的。

程式設計師不應該為他或她建立的數字物件去考慮記憶體的問題。因為 ARC 在編譯時就處理了所有的記憶體管理事務, 記憶體管理所有消耗的腦力現在可以被用來專注於核心的應用邏輯以及新的功能特性。因為 Swift 中的 ARC 在過程式的和麵向物件的程式碼中都能起作用,它也就不再需要程式設計師進行心理上的上下文切換了, 即使是他們在編寫要觸及底層API的程式碼時也不需要 — 這在目前版本的 Objective-C 中就是一個實實在在的問題。

自動和高效能的記憶體管理是一個已經被解決的問題,而蘋果公司已經證明了這個問題的解決可以提高生產力. 另外一個副作用就是 Objective-C 和 Swift 不會像 Java,Go 或者 C# 那樣遇到垃圾收集器針對沒有被使用的記憶體執行清理作業的情況. 這對於那些將會被用於相應圖形和使用者輸入的程式語言而言就是一個非常重要的要素, 特別是在諸如 iPhone、Apple Watch 以及 iPad 這樣的(如果響應滯後就會讓使用者感知上以為應用是壞的)觸控式螢幕裝置上。

5. Swift 程式碼更少

Swift 減少了重複性語句和字串操作所需要的程式碼量。在 Objective-C 中, 使用文字字串將兩塊資訊組合起來的操作非常繁瑣。Swift 採用當代程式語言的特性,比如使用“+”操作符將兩個字串加到一起,這在 Objective-C 中是沒有。像這樣支援對字元和字串的組合對於任何要在螢幕上向使用者展示文字的程式語言的基礎設施。

Swift中的型別系統減少了程式碼語句的複雜性–作為編譯器可以理解的型別。比如,Objective-C要求程式設計師記住特殊字元標記(%s,%d,%@)並且提供了一個用逗號分隔的變數來代替每個標記。Swift支援字串插入,這就消除了需要記住的標記和允許程式設計師直接插入變數到面向使用者的字串中,比如標籤或者按鈕的標題。這類推理系統和字串插入減少錯誤來源在Objective-C中都是很常見的。

在Objective—C中,搞亂了順序或者使用了錯誤字串標記會造成app崩潰。這裡,Swift再次將你從反鎖的工作中解放出來,翻譯成更少要編寫的程式碼(程式碼現在已經不容易出錯)因為它的對處理文字字串和資料的內嵌支援。

6. Swift 更快

刪除遺留下來的C語言約定大大提升了引擎蓋之下Swift的效能. Swift程式碼效能的基準測試一直都瞄向蘋果公司所致力於的Swift執行app邏輯的速度提升.

根據靈長類動物研究所(Primate Lab)——時下流行的 GeekBench 效能工具的創造者——的調查, 2014年12月中使用曼德爾布羅演算法(Mandelbrot algorithm)進行計算密集型任務的效能上,Swift已經逼近C++的表現了.

在2015年2月,靈長類動物研究所發現 Xcode 6.3 測試版提升了Swift在GEMM演算法上的效能 — 這是一種受制於記憶體限制的演算法,需要對大型陣列進行順序訪問 — 有1.4倍. 初始的FFT實現 — 這是一種會對大型陣列進行隨機訪問的受限於記憶體的演算法 — 擁有2.6倍的效能提升.

通過應用最佳實踐,可以觀察到更進一步的效能提升, 結果是 FFT 演算法上8.5倍的效能 (差上 C++ 1.1倍)。這些改進也使得 Swift 在曼德爾布羅演算法上實際超越了 C++ 1.03 倍。

Swift 在 FFT 和曼德爾布羅演算法上幾乎能與 C++ 比肩。根據 Primate Labs 的研究發現,GEMM 演算法的效能表現說明 Swift 編譯器還不能實現 C++ 編譯器支援的向量程式碼 — 所以 Swift 的下一個版本可能會比較容易的獲得一次效能提升。

7. 開源專案中更少的名稱衝突

Objective-C 程式碼中一直令人很困擾的問題就是缺乏對名稱空間的正式支援, 它是 C++ 處理檔名衝突的解決方案。當名稱衝突發生在 Objective-C 中時,就會是一個聯結器錯誤,會導致 app 無法執行。解決的辦法倒是有,可它們都有潛在的隱患。一般的約定是使用兩到三個字母字首來區分編寫的 Objective-C 程式碼, 比方說,通過 Facebook 來展現出你自己的程式碼。

Swift 提供了隱含的名稱空間,允許相同的程式碼檔案存在於多個專案,而不會造成構建失敗,或者需要向 NSString (Next Step — Steve Jobs 被 Apple 炒魷魚之後建立的公司) 或者 CGPoint (Core Graphics)這樣的名稱。最終,Swift 中的這一特性使得開發者更加的有生產力,並且也意味著他們沒必要再做 Objective-C 需要的備忘式記憶工作。在簡單如 Array,Dictionary 以及 String 這樣的名字中你可以看到 Swift 的影響力,而不是脫胎於缺少名稱空間的 Objective-C 中的 NSArray、NSDictionary 以及 NSString。

Swift 的名稱空間是基於一份程式碼檔案所屬的目標位置。這就意味可以使用名稱空間標識來區分出不同的類和值。Swift 中的這個改變很大,它極大的方便了將開發員專案、框架以及庫整合到你程式碼中來的操作。名稱空間使得在整合開源專案時,不用擔心來自不同軟體公司的同名程式碼檔案會發生衝突。現在 Facebook 和蘋果公司可以同時使用一個叫做 FlyingCar.swift 的物件程式碼檔案,不會有任何錯誤或者失敗。

8. Swift 支援動態庫

Swift 中沒有受到足夠重視的一個最大的問題是靜態庫向動態庫的切換,其在主要釋出版(iOS8,iOS7等等)會被更新。動態庫是可以被連結到 app 的可執行程式碼塊。這一特性可以讓現有的 Swift 應用可以連結到隨著時間推移所產生的更新版本的 Swift 語言。

開發者將 app 連同庫檔案一併提交,它們都用開發者證照打上了數字簽名,以確保完整性 (你好, NSA)。這就意味著 Swift 可以比 iOS 更快地進化,對於一種現代程式語言而言這是必要的。對庫檔案的修改可以被全部引入 AppStore 上某個 app 的最新更新中,一起執行起來都如此簡單.

動態庫在 iOS 上從未受到支援,直到 Swift 和 iOS 8 的釋出,儘管已經在 Mac 獲得支援很久了。動態庫處在應用可執行檔案之外,不過會被包含在從 AppStore 上下載的應用包中。它減小了 app 被載入到記憶體中的初始大小,因為外部程式碼只在被用到時才會被連結進來。

移動應用程式或者是 Apple Watch 上的嵌入式應用所具有的延遲載入能力,將提升應用面向使用者的感知效能。這是使得 iOS 生態系統更具感官上的響應性的區別之一。蘋果公司原先只專注於執行時載入資料和資源,現在程式碼的編譯和連結也可以在執行時進行。執行時載入減少的等待時間,直到資源需要被用於展示在螢幕上時,才會被載入進來。

Swift 中的動態庫讓程式語言的修改升級比以往更快的傳播出去成為了可能。使用者不在需要等待指定的iOS 版本釋出才能享受到 Apple 引入 Swift 中的效能和可靠性改進.

9. Swift Playgrounds 鼓勵互動式編碼

Swift 新引入的 Playgrounds 是有經驗的開發者的福音。Playgrounds 的靈感來自於蘋果公司前僱員 Brett Victor 的工作。Playgrounds 可以讓程式設計師用比如說5到20行程式碼來測試一種新的演算法或者圖形程式,不用去建立一個完整的 iPhone 應用。

蘋果公司已經將內聯程式碼執行操作加入到了 Playgrounds 中,以幫助程式設計師建立程式碼塊或者編寫某種演算法時獲得反饋。這樣的反饋迴圈可以提升程式碼編寫的速度,因為傳統程式設計師所需要的心智模型已經為 Playground 的資料視覺化形式所替代。程式設計是一個反覆的過程,任何可能壓力上的減輕或者創造的補充都會使得開發者更具生產力,並能釋放出他們的精力來解決更大的問題,而不是死盯著傳統編譯器來增加程式設計師的繁瑣細節。

注意:據我教授新手程式設計師的經驗,Playgrounds 對於入門者而言不會像對有經驗的程式設計師那麼有用。如果只是簡單的展示 Swift 中一個變數是如何工作的,Playggrounds 顯然不能對幫助新手理解對於一個浮點指標變數與一個整型變數的需要。當你要展示一個能記憶你最後在 Facebook 新聞提要中的滾動位置時,這種需要才會變得明顯。對於新手而言,“為什麼”這個問題只能用一個可以執行示例:也就是一個 iPhone 應用,來回答。

10. Swift 是一個你可以影響的未來

Objective-C 沒有任何出路,你將不會看到它發生改變,我們要感謝 Swift 的引入. 一些 Swift 特性肯能會整合到 Objective-C, 但 Objective-C 的 C 語言遺留物還是註定了它只能吸收那麼點 Swift 的好東西。

Swift 向開發者社群提供了一個直接的方式,去影響一門語言,它將會被用於應用的建立,嵌入式系統(如果蘋果公司向第三方的嵌入式框架和晶片進行了授權)以及像 Apple Watch 這樣的裝置.

蘋果公司專注於提供最佳的消費者體驗,而且只構建值得注意的功能特性. 隨著 Xcode6.3 中 Swfit1.2 的釋出,蘋果公司已經利用流行的 Apple Bug Reporter 工具修復了數以千計的 bug。支撐 Swfit 開發和改進的團隊對於如何提升語言,以更好的支援那些使用 Swift 構建應用和系統的開發社群很感興趣。

Swift: 更易上手,特性豐富的語言

從丟棄 Objective-C 賴以構建的傳統語言開始,一大堆變化讓 Swift 超越了 Objective-C。Apple 並沒有丟棄 Cocoa—— 這是他們的用於建立蘋果風格體驗的 API 和程式碼庫——而是提供了一個完整功能的等價物,使得同支援 Force Touch 或者 Taptic Feedback 這類特性的新 API 互動起來更加簡單。

許多舊的設計決定都旨在讓編譯器的設計更加容易。Swift 則專注於通過拋棄傳統的緊張心理和編碼實踐,來使得應用開發者的工作更加輕鬆。隨著現代編譯器的發展,少量的程式碼可以表示更多的資訊.

使用 Swift,程式設計師只要維護原來一半量的程式碼檔案,手動的程式碼同步工作為零,標點輸入出錯的概率也遠遠低於以前 — 這樣就能騰出更多的時間寫高質量的程式碼。通過使用可選型別 —— 一種針對返回或不返回值的編譯時安全機制,而返回值是同步操作、網路失效時無效的使用者輸入以及資料驗證錯誤發生時普遍會遇到的問題。ARC 在 Swift 中對過程式 C 風格的程式碼,還有蘋果公司 Cocoa 框架使用的物件導向程式碼都進行了統一。

開發者會發現他們寫的 Swift 比較少,而現代的程式語言特性則支援著他們行行程式碼都保持更多的可讀性。隨著其不斷髮展,Swift 會保持整個蘋果公司的生態系統在程式設計領域的先進性,這都要感謝 iOS 和 Swift 中對動態庫的支援。開源專案、第三方 SDK 以及框架可以更容易的整合進家居自動化裝置以及社交服務中,不會有編譯時間的增長。Swift 在某些演算法的速度上幾乎與 C++ 一樣的快,而最新版的Xcode 6.3 和 Swift 1.2 則在這一起跑線上把目標指向更多的效能優化。

再加上 playgrounds 和 swift 允許用一個新的方法來開發視覺反饋協助使用內聯資料視覺化演算法程式,讓一個較短的反饋迴路和圖形描述迭代譯碼過程更容易開始。

最終,Swift 是一個平易近人的全功能的程式語言,未來將允許開發者不僅構建 app 還支援嵌入式系統比如新的低功耗 apple watch。

相關文章