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ù):map,filter和reduce,以及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快。
- 靜態(tài)語(yǔ)言相對(duì)來(lái)說(shuō)語(yǔ)言本身速度更快,swift編譯期間就能生成
細(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
- 如果self已經(jīng)被釋放,置為
-
__unsafe_unretained typeof(self) weakSelf;- 如果self已經(jīng)被釋放,則出現(xiàn)野指針訪問(wèn)