本文參考糾結(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】類型春瞬。