Object-C和Swift的區(qū)別

本文參考糾結(jié)的哈士奇淺談Swift和OC的區(qū)別

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

Swift和Objective-C共用一套運行時環(huán)境渔隶,Swift的類型可以橋接到Objective-C(下面我簡稱OC)孽亲,反之亦然孟害。

其次就是橄霉,OC之前積累的很多類庫硅堆,在Swift中大部分依然可以直接使用皂冰,當(dāng)然,Swift3之后苛聘,一些語法改變了很多涂炎,不過還是有跡可循的忠聚。OC出現(xiàn)過的絕大多數(shù)概念,比如引用計數(shù)唱捣、ARC两蟀、屬性、協(xié)議震缭、接口赂毯、初始化、擴展類拣宰、命名參數(shù)党涕、匿名函數(shù)等,在Swift中繼續(xù)有效(可能最多換個術(shù)語)巡社。Swift大多數(shù)概念與OC一樣膛堤。當(dāng)然Swift也多出了一些新興概念,這些在OC中是沒有的重贺,比如范型骑祟、元組等。

2. Swift比Objective-C有什么優(yōu)勢

1气笙、Swift容易閱讀次企,語法和文件結(jié)構(gòu)簡易化。

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

3谭期、Swift更加安全堵第,它是類型安全的語言。

4隧出、Swift代碼更少踏志,簡潔的語法,可以省去大量冗余代碼

5胀瞪、Swift速度更快针余,運算性能更高。

3. 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)禽拔。

4. Swift其他功能說明
4.1 Swift的內(nèi)存管理

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

4.2 Swift的可選項類型(Optionals)介紹

Swift引入了可選項類型睹栖,用于處理變量值不存在的情況。Optionals類似于OC中指向nil的指針茧痕,但是適用于所有數(shù)據(jù)類型野来,而非僅僅局限于類,Optionals相比于OC中的nil指針踪旷,更加安全和簡明曼氛,并且也是Swift諸多最強大功能的核心。

4.3 Swift中的 埃脏!和 搪锣?

這兩個符號是用來標(biāo)記這個變量的值是否可選秋忙,彩掐!表示可選變量必須保證轉(zhuǎn)換能夠成功,否則報錯灰追,但定義的變量可以直接使用堵幽;狗超?表示可選變量即使轉(zhuǎn)換不成功也不會報錯,變量值為nil朴下,如果轉(zhuǎn)換成功努咐,要使用該變量時,后面需要加殴胧!進行修飾渗稍。

4.4 Swift中范型的簡單說明

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

4.5 Swift的訪問權(quán)限變更

swift新增了兩種訪問權(quán)限拱燃,權(quán)限更細化。具體查看這里:
訪問權(quán)限由大到小依次為:open力惯,public碗誉,internal(默認(rèn)),fileprivate父晶,private

4.5.1 fileprivate

在原有的swift中的 private其實并不是真正的私有哮缺,如果一個變量定義為private,在同一個文件中的其他類依然是可以訪問到的甲喝。這個場景在使用extension的時候很明顯蝴蜓。

這樣帶來了兩個問題:
(1)當(dāng)我們標(biāo)記為private時,意為真的私有還是文件內(nèi)可共享呢俺猿?
(2)當(dāng)我們?nèi)绻鈭D為真正的私有時,必須保證這個類或者結(jié)構(gòu)體在一個單獨的文件里押袍。否則可能同文件里其他的代碼訪問到诵冒。

由此,在swift 3中谊惭,新增加了一個 fileprivate來顯式的表明汽馋,這個元素的訪問權(quán)限為文件內(nèi)私有。

過去的private對應(yīng)現(xiàn)在的fileprivate∪現(xiàn)在的private則是真正的私有豹芯,離開了這個類或者結(jié)構(gòu)體的作用域外面就無法訪問。
所以fileprivate > private .

4.5.2 open

open則是彌補public語義上的不足驱敲。

現(xiàn)在的pubic有兩層含義:
(1)這個元素可以在其他作用域被訪問
(2)這個元素可以在其他作用域被繼承或者override

繼承是一件危險的事情铁蹈。尤其對于一個framework或者module的設(shè)計者而言。在自身的module內(nèi)众眨,類或者屬性對于作者而言是清晰的握牧,能否被繼承或者override都是可控的容诬。但是對于使用它的人,作者有時會希望傳達出這個類或者屬性不應(yīng)該被繼承或者修改沿腰。這個對應(yīng)的就是 final览徒。

final的問題在于在標(biāo)記之后,在任何地方都不能override颂龙。而對于lib的設(shè)計者而言习蓬,希望得到的是在module內(nèi)可以被override,在被import到其他地方后其他用戶使用的時候不能被override措嵌。

通俗的理解public和open就是:

public:可以被任何人訪問友雳,但其他module中不可以被override和繼承,而在本module內(nèi)可以被override和繼承铅匹。

open:可以被任何人使用粉铐,包括override和繼承汉规。
4.5.3 internal

internal是系統(tǒng)默認(rèn)訪問級別阱飘,internal修飾符可寫可不寫渠欺。

(1)internal訪問級別所修飾的屬性或方法在源代碼所在的整個模塊都可以訪問。
(2)如果是框架或者庫代碼罗丰,則在整個框架內(nèi)部都可以訪問神帅,框架由外部代碼所引用時,則不可以訪問萌抵。
(3)如果是App代碼找御,也是在整個App代碼,也是在整個App內(nèi)部可以訪問绍填。

5. 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
6. Swift便捷的函數(shù)式編程

Swift提供了Map、FlatMap审葬、Filter深滚、Reduce等函數(shù)方法,能夠大大方便我們對對象處理涣觉。

Map

var results = [1,3,5,7]
let results = values.map ({ (element) -> Int in
    return element * 2
})
//"[2, 6, 10, 14]"

Filter:

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

Reduce:

var values = [1,3,5]
let initialResult = 0
var reduceResult = values.reduce(initialResult, combine: { (tempResult, element) -> Int in
    return tempResult + element
})
print(reduceResult)
//9
7. 其他補充 - swift獨有
7.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{}
7.2 獨有的元組類型

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

var value = (Int,String) = (x:15,y:"abc")
7.3 swift中使用let定義常量,var定義變量
使用常量,更加安全,不能夠被修改,在需要對對象進行修改的時候 只能用var修飾.
7.4 if let 、 guard let 的用法
縮減代碼量员淫,安全處理數(shù)據(jù)邏輯合蔽。
8. 細節(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類型更加嚴(yán)格 从隆,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】類型春瞬。
最后編輯于
?著作權(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é)果婚禮上英古,老公的妹妹穿的比我還像新娘淀衣。我一直安慰自己,他們只是感情好召调,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布膨桥。 她就那樣靜靜地躺著蛮浑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪只嚣。 梳的紋絲不亂的頭發(fā)上沮稚,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音册舞,去河邊找鬼蕴掏。 笑死,一個胖子當(dāng)著我的面吹牛环础,可吹牛的內(nèi)容都是我干的囚似。 我是一名探鬼主播剩拢,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼线得,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徐伐?” 一聲冷哼從身側(cè)響起贯钩,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎办素,沒想到半個月后角雷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡性穿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年勺三,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(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
  • 正文 我出身青樓驻襟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芋哭。 傳聞我的和親對象是個殘疾皇子沉衣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,452評論 0 4
  • 因為要結(jié)局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細...
    uniapp閱讀 4,391評論 0 12
  • 一直沒有時間好好看一下swift减牺,最近復(fù)習(xí)了一遍語法豌习,這里記錄swift學(xué)習(xí)過程中遇到的一些問題和要點,和Obje...
    bomo閱讀 2,334評論 0 25
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,776評論 1 10
  • 昨晚挺幸運的拔疚,品嘗到了夢寐以求的白葡萄酒肥隆,還是阿根廷出產(chǎn)的。其實我本來是個打算用它來做料理的稚失,反正一次也用不完栋艳,干...
    夏野閱讀 191評論 0 0