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

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

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

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

iOS OC和Swift進行互相調(diào)用颜骤。

其次就是,OC之前積累的很多類庫捣卤,在Swift中大部分依然可以直接使用,當然八孝,Swift3之后董朝,一些語法改變了很多,不過還是有跡可循的干跛。OC出現(xiàn)過的絕大多數(shù)概念子姜,比如引用計數(shù)、ARC楼入、屬性哥捕、協(xié)議、接口嘉熊、初始化遥赚、擴展類、命名參數(shù)阐肤、匿名函數(shù)等凫佛,在Swift中繼續(xù)有效(可能最多換個術(shù)語)讲坎。Swift大多數(shù)概念與OC一樣。當然Swift也多出了一些新興概念愧薛,這些在OC中是沒有的晨炕,比如范型、元組等毫炉。


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

答案是還不行瓮栗。

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


二丰榴、Swift比Objective-C有什么優(yōu)勢货邓?

1、Swift容易閱讀四濒,語法和文件結(jié)構(gòu)簡易化换况。

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

3、Swift更加安全喳资,它是類型安全的語言觉吭。

4、Swift代碼更少仆邓,簡潔的語法鲜滩,可以省去大量冗余代碼

5、Swift速度更快节值,運算性能更高徙硅。

三、Swift目前存在的缺點

1搞疗、版本不穩(wěn)定嗓蘑,之前升級Swift3大動刀,苦了好多人匿乃,swift4目前還未知

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

3幢炸、社區(qū)的開源項目偏少泄隔,畢竟OC獨大好多年,很多優(yōu)秀的類庫都不支持Swift宛徊,不過這種狀況正在改變梅尤,現(xiàn)在有好多優(yōu)秀的Swift的開源類庫了

4柜思、公司使用的比例不高,很多公司以穩(wěn)為主巷燥,還是在使用OC開發(fā)赡盘,很少一些在進行混合開發(fā),更少一些是純Swift開發(fā)缰揪。

5陨享、偶爾開發(fā)中遇到的一些問題,很難查找到相關(guān)資料钝腺,這是一個弊端抛姑。

6、純Swift的運行時和OC有本質(zhì)區(qū)別艳狐,一些OC中運行時的強大功能定硝,在純Swift中變無效了。

7毫目、對于不支持Swift的一些第三方類庫蔬啡,如果非得使用,只能混合編程镀虐,利用橋接文件實現(xiàn)箱蟆。

四、Swift其他功能說明

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

Swift使用自動引用計數(shù)(ARC)來簡化內(nèi)存管理空猜,與OC一致。

2恨旱、Swift的可選項類型(Optionals)介紹

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

3桌硫、Swift中的 !和 ?啃炸?

這兩個符號是用來標記這個變量的值是否可選铆隘,!表示可選變量必須保證轉(zhuǎn)換能夠成功南用,否則報錯膀钠,但定義的變量可以直接使用掏湾;?表示可選變量即使轉(zhuǎn)換不成功也不會報錯肿嘲,變量值為nil融击,如果轉(zhuǎn)換成功,要使用該變量時雳窟,后面需要加尊浪!進行修飾。

4封救、Swift中范型的簡單說明

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

舉個簡單例子:這兩個方法很類似惩坑,主要就一個參數(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

? ? }

這樣,當我們使用時旭贬,我們?nèi)绻麑蓚€不同類型的數(shù)進行比較怔接,編譯器會馬上提醒我們,從而快速避免這種情況稀轨。


5扼脐、Swift的訪問權(quán)限變更

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

訪問權(quán)限由大到小?依次為:open瓦侮,public,internal(默認)佣谐,fileprivate肚吏,private


6、Swift Foundation框架

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

因為 Cocoa 框架所接受和返回的基本數(shù)據(jù)類型都是自身框架內(nèi)的類型,也就是 Foundation 中所定義的像 NSString雌澄,NSNumber斋泄,NSArray 等這些東西。而脫離 Cocoa 框架進行 app 開發(fā)是不可能的事情镐牺。因此我們在使用 Swift 開發(fā) app 時無法避免地需要在 Swift 類型和 Foundation 類型間進行轉(zhuǎn)換炫掐。如果需要每次顯式地書寫轉(zhuǎn)換的話,大概就沒人會喜歡用 Swift 了睬涧。還好 Swift 與 Foundation 之間的類型轉(zhuǎn)換是可以自動完成的募胃,這使得通過 Swift 使用 Cocoa 時順暢了很多旗唁。

而且這個轉(zhuǎn)換不僅是自動的,而且是雙向的痹束,而且無論何時只要有可能检疫,轉(zhuǎn)換的結(jié)果會更傾向于使用 Swift 類型。也就是說参袱,只要你不寫明類型是需要 NS 開頭的類型的時候电谣,你都會得到一個 Swift 類型。

所以抹蚀,Swift中的類型和OC的類型對應(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ù)方法,能夠大大方便我們對對象處理郑现。

舉例最簡單的場景:

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

五湃崩、其他補充

========================= swift獨有 ====================?

1、范圍運算符

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{}


2废累、獨有的元組類型

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

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


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

使用常量,更加安全,不能夠被修改,在需要對對象進行修改的時候 只能用var修飾.


4日缨、if let 、 guard let 的用法

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


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

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

2耳峦、swift句尾不需要分號?,除非你想在一行中寫三行代碼就加分號隔開焕毫。

3蹲坷、swift數(shù)據(jù)類型都會自動判斷?驶乾, 只區(qū)分變量var 和常量let

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

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

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

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

8、swift ?if后的括號可以省略: ?if a>b {}兰粉,而OC里 if后面必須寫括號故痊。

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

10焰络、Swift3的【Any】可以代表任何類型的值戴甩,無論是類、枚舉闪彼、結(jié)構(gòu)體還是任何其他Swift類型甜孤,這個對應(yīng)OC中的【id】類型。

?六备蚓、Swift的前景

可能很多人會問课蔬,到底該不該學Swift,難度大不大郊尝?

我的理解是:

如果時間可以二跋,可以試著學習,最好能試著寫一點代碼流昏,單純的看書或看教程沒太大意義扎即,實踐出真知。

其實最初期的學習况凉,更多的是語法的轉(zhuǎn)變而已谚鄙,這里的難點是不大的,而Swift的思想我們可以后期慢慢學習并深入體會刁绒。

最后闷营,我還是希望Swift發(fā)展的越來越好籍救,功能和社區(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)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子圆裕,更是在濱河造成了極大的恐慌蒋川,老刑警劉巖扔傅,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件询兴,死亡現(xiàn)場離奇詭異,居然都是意外死亡诽表,警方通過查閱死者的電腦和手機唉锌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竿奏,“玉大人袄简,你說我怎么就攤上這事∫樗” “怎么了痘番?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長平痰。 經(jīng)常有香客問我汞舱,道長,這世上最難降的妖魔是什么宗雇? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任昂芜,我火速辦了婚禮,結(jié)果婚禮上赔蒲,老公的妹妹穿的比我還像新娘泌神。我一直安慰自己,他們只是感情好舞虱,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布欢际。 她就那樣靜靜地躺著,像睡著了一般矾兜。 火紅的嫁衣襯著肌膚如雪损趋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天椅寺,我揣著相機與錄音浑槽,去河邊找鬼。 笑死返帕,一個胖子當著我的面吹牛桐玻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荆萤,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼镊靴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偏竟,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤算行,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苫耸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡儡陨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年褪子,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骗村。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫌褪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胚股,到底是詐尸還是另有隱情笼痛,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布琅拌,位于F島的核電站缨伊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏进宝。R本人自食惡果不足惜刻坊,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望党晋。 院中可真熱鬧谭胚,春花似錦、人聲如沸未玻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扳剿。三九已至旁趟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舞终,已是汗流浹背轻庆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敛劝,地道東北人余爆。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像夸盟,于是被迫代替她去往敵國和親蛾方。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容