淺談Swift和OC的區(qū)別

淺談Swift和OC的區(qū)別

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

Swift和Objective-C共用一套運(yùn)行時(shí)環(huán)境,Swift的類型可以橋接到Objective-C(下面我簡(jiǎn)稱OC),反之亦然。兩者的互相引用混合編程我之前有寫(xiě)過(guò)簡(jiǎn)單介紹,有興趣的可以移步這里:

iOS OC和Swift進(jìn)行互相調(diào)用

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


但是:現(xiàn)階段Swift 到底能不能取代 Objective-C?

答案是還不行。

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


二、Swift比Objective-C有什么優(yōu)勢(shì)?

1、Swift容易閱讀,語(yǔ)法和文件結(jié)構(gòu)簡(jiǎn)易化。

2、Swift更易于維護(hù),文件分離后結(jié)構(gòu)更清晰。

3、Swift更加安全,它是類型安全的語(yǔ)言。

4、Swift代碼更少,簡(jiǎn)潔的語(yǔ)法,可以省去大量冗余代碼

5、Swift速度更快,運(yùn)算性能更高。

三、Swift目前存在的缺點(diǎn)

1、版本不穩(wěn)定,之前升級(jí)Swift3大動(dòng)刀,苦了好多人,swift4目前還未知

2、使用人數(shù)比例偏低,目前還是OC的天下

3、社區(qū)的開(kāi)源項(xiàng)目偏少,畢竟OC獨(dú)大好多年,很多優(yōu)秀的類庫(kù)都不支持Swift,不過(guò)這種狀況正在改變,現(xiàn)在有好多優(yōu)秀的Swift的開(kāi)源類庫(kù)了

4、公司使用的比例不高,很多公司以穩(wěn)為主,還是在使用OC開(kāi)發(fā),很少一些在進(jìn)行混合開(kāi)發(fā),更少一些是純Swift開(kāi)發(fā)。

5、偶爾開(kāi)發(fā)中遇到的一些問(wèn)題,很難查找到相關(guān)資料,這是一個(gè)弊端。

6、純Swift的運(yùn)行時(shí)和OC有本質(zhì)區(qū)別,一些OC中運(yùn)行時(shí)的強(qiáng)大功能,在純Swift中變無(wú)效了。

7、對(duì)于不支持Swift的一些第三方類庫(kù),如果非得使用,只能混合編程,利用橋接文件實(shí)現(xiàn)。

四、Swift其他功能說(shuō)明

1、Swift的內(nèi)存管理

Swift使用自動(dòng)引用計(jì)數(shù)(ARC)來(lái)簡(jiǎn)化內(nèi)存管理,與OC一致。

2、Swift的可選項(xiàng)類型(Optionals)介紹

Swift引入了可選項(xiàng)類型,用于處理變量值不存在的情況。Optionals類似于OC中指向nil的指針,但是適用于所有數(shù)據(jù)類型,而非僅僅局限于類,Optionals相比于OC中的nil指針,更加安全和簡(jiǎn)明,并且也是Swift諸多最強(qiáng)大功能的核心。

3、Swift中的 !和 ??

這兩個(gè)符號(hào)是用來(lái)標(biāo)記這個(gè)變量的值是否可選,!表示可選變量必須保證轉(zhuǎn)換能夠成功,否則報(bào)錯(cuò),但定義的變量可以直接使用;?表示可選變量即使轉(zhuǎn)換不成功也不會(huì)報(bào)錯(cuò),變量值為nil,如果轉(zhuǎn)換成功,要使用該變量時(shí),后面需要加!進(jìn)行修飾。

4、Swift中范型的簡(jiǎn)單說(shuō)明

范型是用來(lái)使代碼能安全工作,swift中的范型可以在函數(shù)數(shù)據(jù)和普通數(shù)據(jù)類型中使用,例如類、結(jié)構(gòu)體或枚舉。范型可以解決代碼復(fù)用的問(wèn)題,

舉個(gè)簡(jiǎn)單例子:這兩個(gè)方法很類似,主要就一個(gè)參數(shù)類型的區(qū)別。

?View Code

func isIntEqual(x:Int,y:Int) -> Bool {

? ? ? ? returnx == y

? ? }

? ? func isStringEqual(x:String,y:String) -> Bool {

? ? ? ? returnx == y

? ? }

我們可以利用范型合并一下:

?View Code

func isObjEqual(x:T,y:T) -> Bool {

? ? ? ? returnx == y

? ? }

這樣,當(dāng)我們使用時(shí),我們?nèi)绻麑蓚€(gè)不同類型的數(shù)進(jìn)行比較,編譯器會(huì)馬上提醒我們,從而快速避免這種情況。


5、Swift的訪問(wèn)權(quán)限變更

swift新增了兩種訪問(wèn)權(quán)限,權(quán)限更細(xì)化。具體查看這里:

訪問(wèn)權(quán)限由大到小?依次為:open,public,internal(默認(rèn)),fileprivate,private


6、Swift Foundation框架

為了方便使用,Swift的基本類型都可以無(wú)縫轉(zhuǎn)換到 Foundation 框架中的對(duì)應(yīng)類型。

因?yàn)?Cocoa 框架所接受和返回的基本數(shù)據(jù)類型都是自身框架內(nèi)的類型,也就是 Foundation 中所定義的像 NSString,NSNumber,NSArray 等這些東西。而脫離 Cocoa 框架進(jìn)行 app 開(kāi)發(fā)是不可能的事情。因此我們?cè)谑褂?Swift 開(kāi)發(fā) app 時(shí)無(wú)法避免地需要在 Swift 類型和 Foundation 類型間進(jìn)行轉(zhuǎn)換。如果需要每次顯式地書(shū)寫(xiě)轉(zhuǎn)換的話,大概就沒(méi)人會(huì)喜歡用 Swift 了。還好 Swift 與 Foundation 之間的類型轉(zhuǎn)換是可以自動(dòng)完成的,這使得通過(guò) Swift 使用 Cocoa 時(shí)順暢了很多。

而且這個(gè)轉(zhuǎn)換不僅是自動(dòng)的,而且是雙向的,而且無(wú)論何時(shí)只要有可能,轉(zhuǎn)換的結(jié)果會(huì)更傾向于使用 Swift 類型。也就是說(shuō),只要你不寫(xiě)明類型是需要 NS 開(kāi)頭的類型的時(shí)候,你都會(huì)得到一個(gè) Swift 類型。

所以,Swift中的類型和OC的類型對(duì)應(yīng)關(guān)系:

String - NSString

Int, Float, Double, Bool 以及其他與數(shù)字有關(guān)的類型 - NSNumber

Array - NSArray

Dictionary - NSDictionary


7、Swift便捷的函數(shù)式編程

Swift提供了Map、FlatMap、Filter、Reduce等函數(shù)方法,能夠大大方便我們對(duì)對(duì)象處理。

舉例最簡(jiǎn)單的場(chǎng)景:

Map:

varresults = [1,3,5,7]

let results = values.map ({ (element) -> Intinreturnelement *2})//"[2, 6, 10, 14]"

Filter:

varvalues = [1,3,5,7,9]

let flattenResults = values.filter{ $0%3==0}//[3, 9]

Reduce:

varvalues = [1,3,5]

let initialResult =0varreduceResult = values.reduce(initialResult, combine: { (tempResult, element) -> IntinreturntempResult + element

})

print(reduceResult)//9

五、其他補(bǔ)充

========================= swift獨(dú)有 ====================?

1、范圍運(yùn)算符

a...b 表示 [a,b] 包括a和b 。 (如3...5 ?就是范圍取3,4,5)

a..<b 表示 [a,b) 包括a,不包括b 。?(如3...5 ?就是范圍取3,4)

常見(jiàn)的如for循環(huán):for i in 0...9{}


2、獨(dú)有的元組類型

元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值。元組內(nèi)的值可以使任意類型,并不要求是相同類型。eg:

varvalue = (Int,String) = (x:15,y:"abc")


3、swift中使用let定義常量,var定義變量

使用常量,更加安全,不能夠被修改,在需要對(duì)對(duì)象進(jìn)行修改的時(shí)候 只能用var修飾.


4、if let 、 guard let 的用法

縮減代碼量,安全處理數(shù)據(jù)邏輯。


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

1、swift不分.h和.m文件?,一個(gè)類只有.swift一個(gè)文件,所以整體的文件數(shù)量比起OC有一定減少。

2、swift句尾不需要分號(hào)?,除非你想在一行中寫(xiě)三行代碼就加分號(hào)隔開(kāi)。

3、swift數(shù)據(jù)類型都會(huì)自動(dòng)判斷?, 只區(qū)分變量var 和常量let

4、強(qiáng)制類型轉(zhuǎn)換格式不同 ? OC強(qiáng)轉(zhuǎn):(int)a ? ? ?Swift強(qiáng)轉(zhuǎn):Int(a)

5、關(guān)于BOOL類型更加嚴(yán)格?,Swift不再是OC的非0就是真,而是true才是真false才是假?

6、swift的?循環(huán)語(yǔ)句中必須加{}?就算只有一行代碼也必須要加?

7、swift的switch語(yǔ)句后面可以跟各種數(shù)據(jù)類型了?,如Int、字符串都行,并且里面不用寫(xiě)break(OC好像不能字符串)

8、swift ?if后的括號(hào)可以省略: ?if a>b {},而OC里 if后面必須寫(xiě)括號(hào)。

9、swift打印 ?用print("") ? ?打印變量時(shí)可以 ?print("\(value)"),不用像OC那樣記很多%@,d%等。

10、Swift3的【Any】可以代表任何類型的值,無(wú)論是類、枚舉、結(jié)構(gòu)體還是任何其他Swift類型,這個(gè)對(duì)應(yīng)OC中的【id】類型。

?六、Swift的前景

可能很多人會(huì)問(wèn),到底該不該學(xué)Swift,難度大不大?

我的理解是:

如果時(shí)間可以,可以試著學(xué)習(xí),最好能試著寫(xiě)一點(diǎn)代碼,單純的看書(shū)或看教程沒(méi)太大意義,實(shí)踐出真知。

其實(shí)最初期的學(xué)習(xí),更多的是語(yǔ)法的轉(zhuǎn)變而已,這里的難點(diǎn)是不大的,而Swift的思想我們可以后期慢慢學(xué)習(xí)并深入體會(huì)。

最后,我還是希望Swift發(fā)展的越來(lái)越好,功能和社區(qū)完善的更棒。

func isIntEqual(x:Int,y:Int) -> Bool {

? ? ? ? returnx == y

? ? }

? ? func isStringEqual(x:String,y:String) -> Bool {

? ? ? ? returnx == y

? ? }

varvalues = [1,3,5]

let initialResult =0varreduceResult = values.reduce(initialResult, combine: { (tempResult, element) -> IntinreturntempResult + element

})

print(reduceResult)//9

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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