1.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ù)、匿名函數(shù)等,在Swift中繼續(xù)有效(可能最多換個(gè)術(shù)語(yǔ))。Swift大多數(shù)概念與OC一樣。當(dāng)然Swift也多出了一些新興概念,這些在OC中是沒(méi)有的,比如范型、元組等。
2. 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)算性能更高。
3. Swift目前存在的缺點(diǎn)
1、版本不穩(wěn)定,之前升級(jí)Swift3大動(dòng)刀,苦了好多人
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)。
4. 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)題,
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
-
fileprivate
在原有的swift中的 private其實(shí)并不是真正的私有,如果一個(gè)變量定義為private,在同一個(gè)文件中的其他類依然是可以訪問(wèn)到的。這個(gè)場(chǎng)景在使用extension的時(shí)候很明顯。
這樣帶來(lái)了兩個(gè)問(wèn)題:
(1)當(dāng)我們標(biāo)記為private時(shí),意為真的私有還是文件內(nèi)可共享呢?
(2)當(dāng)我們?nèi)绻鈭D為真正的私有時(shí),必須保證這個(gè)類或者結(jié)構(gòu)體在一個(gè)單獨(dú)的文件里。否則可能同文件里其他的代碼訪問(wèn)到。
由此,在swift 3中,新增加了一個(gè) fileprivate來(lái)顯式的表明,這個(gè)元素的訪問(wèn)權(quán)限為文件內(nèi)私有。
過(guò)去的private對(duì)應(yīng)現(xiàn)在的fileprivate?,F(xiàn)在的private則是真正的私有,離開(kāi)了這個(gè)類或者結(jié)構(gòu)體的作用域外面就無(wú)法訪問(wèn)。
所以fileprivate > private .
-
open
open則是彌補(bǔ)public語(yǔ)義上的不足。
現(xiàn)在的pubic有兩層含義:
(1)這個(gè)元素可以在其他作用域被訪問(wèn)
(2)這個(gè)元素可以在其他作用域被繼承或者override
繼承是一件危險(xiǎn)的事情。尤其對(duì)于一個(gè)framework或者module的設(shè)計(jì)者而言。在自身的module內(nèi),類或者屬性對(duì)于作者而言是清晰的,能否被繼承或者override都是可控的。但是對(duì)于使用它的人,作者有時(shí)會(huì)希望傳達(dá)出這個(gè)類或者屬性不應(yīng)該被繼承或者修改。這個(gè)對(duì)應(yīng)的就是 final。
final的問(wèn)題在于在標(biāo)記之后,在任何地方都不能override。而對(duì)于lib的設(shè)計(jì)者而言,希望得到的是在module內(nèi)可以被override,在被import到其他地方后其他用戶使用的時(shí)候不能被override。
通俗的理解public和open就是:
public:可以被任何人訪問(wèn),但其他module中不可以被override和繼承,而在本module內(nèi)可以被override和繼承。
open:可以被任何人使用,包括override和繼承。
-
internal
internal是系統(tǒng)默認(rèn)訪問(wèn)級(jí)別,internal修飾符可寫(xiě)可不寫(xiě)。
(1)internal訪問(wèn)級(jí)別所修飾的屬性或方法在源代碼所在的整個(gè)模塊都可以訪問(wèn)。
(2)如果是框架或者庫(kù)代碼,則在整個(gè)框架內(nèi)部都可以訪問(wèn),框架由外部代碼所引用時(shí),則不可以訪問(wèn)。
(3)如果是App代碼,也是在整個(gè)App代碼,也是在整個(gè)App內(nèi)部可以訪問(wèn)。
5. 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
6. Swift便捷的函數(shù)式編程
Swift提供了Map、FlatMap、Filter、Reduce等函數(shù)方法,能夠大大方便我們對(duì)對(duì)象處理。
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. 其他補(bǔ)充 - swift獨(dú)有
-
范圍運(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{}
-
獨(dú)有的元組類型
元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值。元組內(nèi)的值可以使任意類型,并不要求是相同類型
var value = (Int,String) = (x:15,y:"abc")
-
swift中使用let定義常量,var定義變量
使用常量,更加安全,不能夠被修改,在需要對(duì)對(duì)象進(jìn)行修改的時(shí)候 只能用var修飾.
-
if let 、 guard let 的用法
縮減代碼量,安全處理數(shù)據(jù)邏輯。
8. 細(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】類型。
本文內(nèi)容摘自
作者:路飛_Luck
鏈接:http://www.itdecent.cn/p/3b19b806867b