Swift和Objective-C的優(yōu)缺點(diǎn)對(duì)比

Swift和Objective-C的聯(lián)系

Swift和Objective-C共用一套運(yùn)行時(shí)環(huán)境,Swift的類型可以橋接到Objective-C(下面我簡(jiǎn)稱OC),反之亦然

其次就是,OC之前的積累的很多類庫(kù),在Swift中大部分依然可以直接使用,當(dāng)然,Swift3之后,一些語(yǔ)法改變了很多,不過(guò)還是有跡可循的。OC出現(xiàn)過(guò)的絕大多數(shù)概念,比如引用計(jì)數(shù)、ARC、屬性、協(xié)議、接口、初始化、擴(kuò)展類、命名參數(shù)、block等,在Swift中繼續(xù)有效(可能最多換個(gè)術(shù)語(yǔ))。Swift大多數(shù)概念與OC一樣。當(dāng)然Swift也多出了一些新興概念,這些在OC中是沒有的,比如泛型、元組。

但是:現(xiàn)階段Swift能完全取代Objective-C嗎?
答案是還不行。
其實(shí)到現(xiàn)在為止Swift離完全替代Objective-C還是很遙遠(yuǎn),因?yàn)锳pple內(nèi)部一直在用Objective-C來(lái)做一些Framework的開發(fā),底層也不可能用Swift實(shí)現(xiàn),所以現(xiàn)在更多的替代是體現(xiàn)在外部開發(fā)。

Swift對(duì)比Objective-C的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

  • swift是類型安全的語(yǔ)言,注重安全,OC注重靈活
  • swift注重面向協(xié)議編程、函數(shù)式編程、面向?qū)ο缶幊?,OC注重面向?qū)ο缶幊?/strong>
  • swift注重值類型,OC注重指針和引用
  • swift是靜態(tài)類型語(yǔ)言,OC是動(dòng)態(tài)類型語(yǔ)言
  • swift容易閱讀,文件結(jié)構(gòu)和大部分語(yǔ)法簡(jiǎn)易化,只有.swift文件,結(jié)尾不需要分號(hào)
  • swift中的可選類型,是用于所有數(shù)據(jù)類型,而不僅僅局限于類。相比于OC中的nil更加安全和簡(jiǎn)明
  • swift中的泛型類型更加方便和通用,而非OC中只能為集合類型添加泛型
  • swift中各種方便快捷的[高階函數(shù)]函數(shù)式編程)(Swift的標(biāo)準(zhǔn)數(shù)組支持三個(gè)高階函數(shù):mapfilterreduce,以及map的擴(kuò)展flatMap
  • swift新增了兩種權(quán)限,細(xì)化權(quán)限。open > public > internal(默認(rèn))> fileprivate > private
  • swift中獨(dú)有的元組類型(tuples),把多個(gè)值組合成復(fù)合值。元組內(nèi)的值可以是任何類型,并不要求是相同類型的。
  • swift支持函數(shù)式編程,Objc本身是不支持的,需要通過(guò)引入ReactiveCocoa這個(gè)庫(kù)才可支持函數(shù)式編程。

缺點(diǎn)

  • 版本不穩(wěn)定
  • 公司使用比例不高,使用人數(shù)比例偏低
  • 社區(qū)的開源項(xiàng)目偏少,畢竟OC獨(dú)大好多年,很多優(yōu)秀的類庫(kù)都不支持Swift,不過(guò)這種狀況正在改變,現(xiàn)在有好多優(yōu)秀的Swift的開源類庫(kù)了
  • 偶爾開發(fā)中遇到的一些問(wèn)題,很難查找到相關(guān)資料,這是一個(gè)弊端。
  • 對(duì)于不支持Swift的一些第三方類庫(kù),如果非得使用,只能混合編程,利用橋接文件實(shí)現(xiàn)。
  • App體積變大:使用 Swift 后, App 體積大概增加 5-8 M 左右,對(duì)體積大小敏感的慎用。(體積變大的原因是因?yàn)?Swift 還在變化,所以 Apple 沒有在 iOS 系統(tǒng)里放入 Swift 的運(yùn)行庫(kù),反而是每個(gè) App 里都要包含其對(duì)應(yīng)的 Swift 運(yùn)行庫(kù)。)
  • 上線方式改變:在上線的時(shí)候,不能使用application Loader上傳包文件,會(huì)提示你丟失了swift support files,應(yīng)該使用xcode直接上傳。

整體總結(jié)

  • String:Swift中String操作已經(jīng)甩OC三百萬(wàn)條街
  • Discriminated Union:swift里的enum. 是靜態(tài)語(yǔ)言獨(dú)有的特性.
  • 安全:
    • 由于swift的strong static type system,編譯器可幫你檢查出更多問(wèn)題,而不是在運(yùn)行時(shí)突然boom,還有一個(gè)很牛逼的安全特性就是OptionalType。
  • 快速:
    • 靜態(tài)語(yǔ)言相對(duì)來(lái)說(shuō)語(yǔ)言本身速度更快,swift編譯期間就能生成vtable,確定具體要調(diào)用的方法,比起oc的動(dòng)態(tài)派發(fā)自然是更快,當(dāng)然處理到與oc之間的橋接部分,可能不一定比OC快。

細(xì)節(jié)使用區(qū)別

  • 在 Swift 中沒有了 main.m,@UIApplicationMain 是程序入口
  • swift不分.h和.m文件 ,一個(gè)類只有.swift一個(gè)文件,所以整體的文件數(shù)量比起OC有一定減少。
  • swift句尾不需要分號(hào) ,除非你想在一行中寫三行代碼就加分號(hào)隔開。
  • 在 Swift 中,一個(gè)類就是用一對(duì) { } 括起的,沒有 @implementation 和 @end
  • swift數(shù)據(jù)類型都會(huì)自動(dòng)判斷 , 只區(qū)分變量var 和常量let
  • 強(qiáng)制類型轉(zhuǎn)換格式不同 OC強(qiáng)轉(zhuǎn):(int)a Swift強(qiáng)轉(zhuǎn):Int(a)
  • 關(guān)于BOOL類型更加嚴(yán)格 ,Swift不再是OC的非0就是真,而是true才是真false才是假
  • swift的 循環(huán)語(yǔ)句中必須加{}就算只有一行代碼也必須要加
  • swift的switch語(yǔ)句后面可以跟各種數(shù)據(jù)類型了 ,如Int、字符串都行,并且里面不用寫break(OC好像不能字符串)
  • swift if后的括號(hào)可以省略: if a>b {},而OC里 if后面必須寫括號(hào)。
  • swift打印 用print("") 打印變量時(shí)可以 print("(value)"),不用像OC那樣記很多%@,d%等。
  • Swift3的Any可以代表任何類型的值,無(wú)論是類、枚舉、結(jié)構(gòu)體還是任何其他Swift類型,這個(gè)對(duì)應(yīng)OC中的id類型。
  • 在OC中alloc / init對(duì)應(yīng)()
  • 在 OC 中 alloc / initWithXXX 對(duì)應(yīng) (XXX: )
  • 在 OC 中的類函數(shù)調(diào)用,在 Swift 中,直接使用.
  • 在 Swift 中,絕大多數(shù)可以省略 self.,建議一般不寫,可以提高對(duì)語(yǔ)境的理解(閉包時(shí)會(huì)體會(huì)到)
  • 在 OC 中的 枚舉類型使用 UIButtonTypeContactAdd,而 Swift 中分開了,操作熱鍵:回車-> 向右 ->.
  • Swift 中,枚舉類型的前綴可以省略,如:.ContactAdd,但是:很多時(shí)候沒有智能提示
  • swift中的范圍運(yùn)算符更靈活
    • a...b 表示 [a,b] 包括a和b 。 (如3...5 就是范圍取3,4,5)
    • a..<b 表示 [a,b) 包括a,不包括b 。 (如3...5 就是范圍取3,4)
    • 常見的如for循環(huán):for i in 0...9{}

循環(huán)引用問(wèn)題

Objective-C中循環(huán)引用也是遇到比較多的,一不小心就會(huì)導(dǎo)致循環(huán)引用,甚至導(dǎo)致內(nèi)存問(wèn)題

Swift

  • weak var weakSelf = self
    • 只能用于變量,不能用于let修飾的常量,self是可選項(xiàng),如果self已經(jīng)被釋放,置為nil
  • unowned let weakSelf = self
    • 既可用于變量也可用于常量,self不是可選項(xiàng),如果self已經(jīng)被釋放,則出現(xiàn)野指針訪問(wèn)

Objective-C

  • __weak typeof(self) weakSelf;
    • 如果self已經(jīng)被釋放,置為nil
  • __unsafe_unretained typeof(self) weakSelf;
    • 如果self已經(jīng)被釋放,則出現(xiàn)野指針訪問(wèn)

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容