歡迎你們前往騰訊雲社區,獲取更多騰訊海量技術實踐乾貨哦~git
做者:段義鵬 程序員
Swift和Objective-C是目前開發 Apple App的兩門主要語言。Swift自2014年發佈到目前爲止其行業現狀如何?Objective-C通過歲月的洗禮其穩定性、性能和開發特性支持度都是比較成熟的,Swift在這些方面是否已經比較完善,開發者是否能夠開始着手大面積使用Swift進行項目開發?Swift和Objective-C在性能方面運行效率是否更好?具體分析請看下文展開。github
Swift和Objective-C是目前開發 Apple App的兩門主要語言。Swift自2014年發佈到目前爲止其行業現狀如何?Objective-C通過歲月的洗禮其穩定性、性能和開發特性支持度都是比較成熟的,Swift在這些方面是否已經比較完善,開發者是否能夠開始着手大面積使用Swift進行項目開發?Swift和Objective-C在性能方面運行效率是否更好?具體分析請看下文展開。objective-c
Swift 於2010年7月啓動開發,蘋果WWDC2014開發者大會上正式發佈問世,2015年12月正式開源(https://swift.org)。編程
(1)談起Swift,不得說說它的做者。小程序
Swift的做者克里斯·拉特納(Chris Lattner), 在05年以前,是美國UIUC大學的博士,在博士期間於2000年啓動和開始主持LLVM項目,2005年7月加盟Apple Inc,以後整個LLVM研發團隊所有加入Apple,致力於LLVM在Apple開發體系中的應用,目前LLVM已經被蘋果IOS開發工具、Xilinx Vivado、Facebook、Google等各大公司採用。Apple也是LLVM項目的主要資助者。swift
Chris Lattner 加入Apple後,成爲LLVM的主要負責人同時也是Xcode的主管,以後發起了Clang項目,於2010年7月啓動開發Swift,以後14年發佈Swift,15年開源Swift,於17年1月從Apple離職,隨後這位在Apple工做了11年的技術大牛正式加入Tesla,6個月後從Tesla主動辭職。數組
Chris Lattner 做爲一名70後程序員,發明了 LLVM、Clang、Swift,同時仍是Xcode的Header,能夠說是牛逼轟轟,大神中的大神,一個不可一世的人才。安全
(2)Swift的版本迭代歷史服務器
Swift 1.x版本屬於剛開始階段,2.x版本添加了不少新特性,3.x版本在Swift生涯中屬於革命性的一步,其中改動了不少,語法和2.x版本也有較大差別。3.x到4.x版本主要是優化和保持穩定性,改動較小。文章後續內容主要針對Swift3版本。
(3)Swift的開發模式及目標
Swift設計的目標也是初衷是在程序運行角度要比C系語言(C, C++, and Objective-C)更快速,開發角度寫法越簡單越高效越好,讓程序員在編程語言語法角度浪費的功夫越少越好,能把更多的時間和精力用於思考和開發應用程序邏輯。同時Swift原始設計爲不只能夠用來開發Hello World這樣的小程序,也能夠用來開發一套完整的操做系統。Swift的出臺至少奠基了Apple將來十年的發展方向,具備重大的戰略意義。
Swift的官方說明:Safe、Fast、Expressive,更安全、更快速、更易表達。安全角度取消了Objective-C不少兼容的語法,只取其一,由於再也不是C的超級,因此那些在C語言上存在的歷史詬病,在Swift上不復存在。
Swift集成了不少高級語言的優秀特性,借鑑了不少高級語言的優秀語法,開發角度寫法相似JavaScript等腳本語言,可是自己又屬編譯性質語言,是一門真正的編譯語言,而非解釋型。
Swift 結合了C和Objective-C 的優勢而且不受 C 兼容性的限制。Swift採用安全的編程模式並添加了不少新特性,好比範型、閉包、函數式編程等,使編程更簡單,更靈活,也更有趣。
開發模式方面,在開源以前主要依賴蘋果Chris Lattner及所帶領的開發團隊,同時隨着Swift的問世,Swift開發者社區也同步創建,Chris Lattner及所帶領的開發團隊很是關注社區建議和郵件列表,針對社區的建議,在Swift新特性支持上Swift團隊並不是單純的建議的新特性就會加上,而每每是後退一步,思考更多,理解開發者真正須要的特性,此後考慮着手開發。
隨着Swift的開源,開源社區開發力量的加入,開發者社區更加活躍,Swift也在更加趨於完善。
(1)編程語言排行榜
看近三年三月份的編程語言排名數據,Swift由2015年的23名上升至2016年的14名,在2017年上升至第10名;再看看Objective-C,由2015年的第3名降低至2016年的第15名,在今年降低至16名。Swift編程語言日趨上升。
(2)開發社區生態
正如Chris Lattner在離開Apple前的近幾年已不怎麼過問LLVM自身的事,而主要投入精力到Swift的研發上同樣,LLVM彼時已創建起成熟的開發者社區,彼時的LLVM已經是社區的LLVM,Chris Lattner在將主要精力轉向Swift的研發上時,LLVM項目自身的存活與否已經不會有什麼影響。
Swift也同樣,Chris Lattner離開Apple前,也已經創建起成熟的Swift開發者社區,此時的Swift也再也不只是Apple的Swift,此時的Swift已經是社區的Swift,Chris Lattner的離開並不會對Swift的發展形成大的影響。加上開源的力量,相信Swift會繼續勇往前行。
(3)開源庫佔比
目前GitHub(https://github.com)上Swift語言的開源項日大約是Objective-C語言的開源項目的5倍還多。
(4)自己成熟度、庫成熟度、Xcode集成環境支持程度
Swift通過3.x版本的改進,語法和性能上已開始趨於穩定,後期4.0版本主要是優化提升性能和穩定性,改動很少,自己成熟度已開始趨於完善。
庫的成熟度,通過Apple的努力,相信也有很多提高,不少在2.x版本尚未Swift版本的庫,3.x版本到4.x版本已經有不少庫用Swift進行了改寫。庫的性能和穩定性目前還很差說,還須要通過海量App的線上驗證,須要通過一段時間的洗禮才能得出結論。既然Apple已經轉向Swift,相信即便有些大大小小的問題蘋果也會積極處理和解決。這方面不用太過擔憂。
Xcode 8就開始支持Swift,目前Xcode 9已經同時支持Swift 3.2和Swift 4.0 版本,可在工程設置裏面設定。
和OC簡單語法對比:
1.簡單值定義
Swift取消了Mutable和非Mutable的區分,全部的簡單值定義改成:經過let定義常量,經過var定義變量。再也不有宏定義,在Swift裏面要實現宏定義,直接用let定義全局常量。以下:
let和var定義簡單值若是指定初始值則再也不須要指定類型,不指定初始值則須要明確指定類型。初始化時指定初始值時編譯器會自動推斷變量類型。
參數打印再也不須要經過%加固定字符來指定打印格式,直接\反斜槓一對圓括號裏面包含常量、變量、字面量和表達式便可。
數組成員和字典Value能夠直接是float、int等基礎類型,不用再像oc裏面須要轉成NSNumber對象。
(1)使用 if 和 let 來處理值缺失的狀況。一個可選的值是一個具體的值或者是 nil 以表示值缺失。在類型後面加一個問號來標記這個變量的值是可選的。
若是optionalName變量的可選值是 nil,條件會判斷爲 false,大括號中的代碼會被跳過。若是不是 ,會將值解包並賦給 let後面的name常量,這樣代碼塊中就可使用這個值了。
(2)另外一種處理可選值的方法是經過使用 ?? 操做符來提供一個默認值。若是可選值缺失的話,可使用默認值來代替。一個??即搞定,再也不須要像oc裏面須要寫if判斷或是問號表達式,Swift變得更加簡潔。
在C/Objective-C中,if、while、for以後的判斷式並不須要必定傳入布爾類型。也能夠傳入整型、指針等類型,只要非0就爲真,而且賦值是有反作用的。好比:
上面的代碼返回a的數值,這樣就有可能出現將判斷:
錯寫成:
爲避免這個問題,有種變通寫法:
這種寫法被稱爲Yoda表達式,由於《星球大戰》中的Yoda大師喜歡使用這樣奇特的倒裝句子。
Swift強制要求if、while、for後面判斷式子必定須要傳入布爾類型。所以寫成如下這種判斷就會編譯錯誤,由於a = 0的結果是a是Int型而非布爾型。Yoda表達式這種變通寫法再也沒有必要。
Swift裏面的Bool常量值是true和false。
switch
Swift中switch語句能夠直接比較string,在以往OC中則要經過不少if else來實現:
Swift中的實現:
switch中一個case語句執行完成後就再也不向下執行。Case裏面沒有break語句,不會再偶然地出現bug!
8.區間運算符
(1)閉區間運算符
閉區間運算符(a…b)定義一個包含從a到b(包括a和b)的全部值的區間。a的值不能超過b。在for-in循環中很是有用。
(2)半開區間運算符
半開區間運算符(a..<b)
定義一個從a到b但不包含b的區間。之因此稱爲半開區間,是由於該區間包含第一個值而不包括最後的值。
9.強制使用大括號
在C/Objective-C中,if、while、for以後的語句假如只有一行,是能夠省略掉大括號的 。好比:
當後面的人修改代碼,或多人修改同一代碼再合併時,可能會在if後面直接插入一行,這樣就必定會return了。
Swift裏面必需要有大括號。
Swift裏面guard語句簡化了函數實現裏面參數有效性的check。像if語句同樣,guard語句的執行取決於一個表達式的布爾值。
可使用 guard 語句來要求條件必須爲真時,以執行guard語句後的代碼。不一樣於 if 語句,一個 guard 語句老是有一個 else 從句,若是條件不爲真則執行 else 從句中的代碼。
Swift 中的 Array 類型還提供一個能夠建立特定大小而且全部數據都被默認的構造方法。
Swift中的元組(tuples)把多個值組合成一個複合值。元組內的值能夠是任意類型,並不要求是相同類型。Eg:
元組的最大用途在函數能夠返回多個值:
Swift裏面定義一個閉包,閉包 = {(形參) -> 返回值 in 代碼實現},in 用於區分函數定義和代碼實現:
最簡單的閉包,若是沒有參數/返回值,則參數/返回值/in 通通均可以省略
範型的應用場景:
swapTwoInts(::)、swapTwoStrings(::) 和 swapTwoDoubles(::) 的函數功能都是相同的,惟一不一樣之處就在於傳入的變量類型不一樣,分別是 Int 、 String 和 Double 。
在實際應用中,一般須要一個更實用更靈活的函數來交換兩個任意類型的值,Swift裏面經過範型來解決。以下:
Swift裏面字符串能夠直接拼接:
也能夠直接比較:
Swift的語法設計使一些C/Objective-C常見錯誤不可能再出現,好比:字符串插值參數打印;if、while、for以後的判斷式強制是Bool類型;switch中case語句取消break;if、while、for以後的語句強制使用大括號。
同時更多的是讓語法更簡單,編程語言的語法進行簡潔化和優化,讓程序員省掉關注語法的時間,將更多的時間和精力放在應用程序邏輯開發上。好比:省略分號;??可選值;switch中能夠直接對String類型進行判斷;區間運算符;guard語句;Array初始化中的repeating;元組;閉包;範型;字符串拼接和直接比較。
如下從開發中經常使用的基礎語句運行效率方面進行對比,對比Swift(3.2和4.0兩個版本)和Objective-C二者的性能差別。
a. 對比維度:循環、自增(Swift 3.0之前有自增運算,3.0後取消了)、賦值、添加字符串到數組、添加整數到數組、添加字符串到字典、添加整數到字典、拼接字符串。
b. 每項操做運行10w次的耗時對比。
c. 模擬器:iPhone 6, iOS 10.2; 真機:iPhone 6, iOS 10.3.3
d. Debug模式下優化級別設爲None:
代碼:見附件
(1)模擬器對比結果:
Swift 3.2:
Swift 4.0
Objective-C:
(2)真機對比結果:
Swift 3.2:
Swift 4.0
Objective-C:
在設定的幾項對比維度內:
a. Swift 3.2到Swift 4.0,性能運行效率提高不明顯,基本沒有提高;
b. 循環、自增、賦值、字符串數組處理、value爲字符串或數值的字典處理操做,Swift性能不如Objective-C;
c. 整型數組處理,Swift優於Objective-C;
d. 字符串拼接處理,Swift性能較Objective-C優點明顯。
總體來看,Swift和Objective-C相比,除了字符串處理優點明顯外,其它基礎操做方面性能稍遜色。
Swift是一門靜態編譯語言,Objective-C是一門運行時動態綁定語言,由於Objective-C的動態特性,致使編譯器能作的優化工做是頗有限的,不少工做只能放到運行時處理,因此從這方面看Swift在編譯時能作的優化能作的更多,從而性能提高空間也較OC的大,但目前來看Swift只有字符串處理方面優化的比較不錯,其它方面並不明顯。
Swift和Objective-C互調須要新建一個XXX-Bridging-Header.h文件作橋接,具體請參看稍後將會發的另一篇文章(後續)
Swift版本更新頻繁,好比2.x到3.x去掉了」++」、」--」自增自減運算。2.x時網上有不少同行驗證Swift的自增自減運算相對OC有嚴重的性能問題,2.x到3.x去掉了不知是否是當前還沒有解決此問題或是有其它的替代方案。
3.x到4.x一個典型的改動點是關於set selector,在Swift 3.x時,selector函數定義前不須要添加@objc修飾。Swift 4.0中則必需要加@objc修飾。其它的改動這裏再也不詳述,請參閱蘋果官方文檔。
Swift所面臨的問題,也即到目前爲止大多數程序員吐槽和詬病的關於動態特性(或叫「反射特性」,相似Java中的反射)。
Objective-C是一門動態語言,對開發者來講即運行時編程,能夠在runtime進行類和方法的增刪修改,甚至是對無源碼的class和類庫進行method swizzling改變原有庫接口的功能等,給開發者提供了足夠大的權限和便利,由於權力夠大,於是容易過分使用,然而也正是這種動態特性的過分使用,致使OC這門語言是不安全的。
Swift並不是在C或OC基礎上進行開發,而是從新設計和佈局,Swift的目標在於具有處理普遍問題的能力,包括服務器端開發和系統編程。由於要求更高的安全性,而動態特性自己容易致使過分使用,動態特性自己是一把雙刃劍,因此蘋果開發工程師整個Swift團隊也正在思考一種更合理的解決方案。
依據前面「四」的對比,Swift和Objective-C相比在字符串處理方面優點明顯,其它方面和OC差很少,實際項目中能夠根據項目性質合理選擇二者之一作爲開發語言,甚至不一樣情境下應用各自語言的各自的優點,不一樣模塊採用不一樣的語言作開發。
Swift融合了至目前爲止大多數高級語言的優秀特性,可謂是站在全部語言的肩膀上,汲取全部語言的精華,是目前行業內最優秀的語言,期待將來在穩定性、性能上的改善能取得更多質的突破。
此文已由做者受權騰訊雲技術社區發佈,轉載請註明文章出處
原文連接:https://cloud.tencent.com/community/article/458646
海量技術實踐經驗,盡在騰訊雲社區!