1.Swift和Objective-C的聯(lián)系
Swift和Objective-C共用一套運(yùn)行時(shí)環(huán)境,Swift的類型可以橋接到Objective-C(下面我簡稱OC)灶搜,反之亦然。
其次就是工窍,OC之前積累的很多類庫割卖,在Swift中大部分依然可以直接使用,當(dāng)然患雏,Swift3之后鹏溯,一些語法改變了很多,不過還是有跡可循的淹仑。OC出現(xiàn)過的絕大多數(shù)概念丙挽,比如引用計(jì)數(shù)、ARC匀借、屬性颜阐、協(xié)議、接口吓肋、初始化凳怨、擴(kuò)展類、命名參數(shù)是鬼、匿名函數(shù)等肤舞,在Swift中繼續(xù)有效(可能最多換個(gè)術(shù)語)。Swift大多數(shù)概念與OC一樣均蜜。當(dāng)然Swift也多出了一些新興概念李剖,這些在OC中是沒有的,比如范型囤耳、元組等篙顺。
2. Swift比Objective-C有什么優(yōu)勢
1、Swift容易閱讀紫皇,語法和文件結(jié)構(gòu)簡易化慰安。
2、Swift更易于維護(hù)聪铺,文件分離后結(jié)構(gòu)更清晰化焕。
3牍氛、Swift更加安全嫌褪,它是類型安全的語言。
4、Swift代碼更少扼鞋,簡潔的語法,可以省去大量冗余代碼
5檬果、Swift速度更快泽篮,運(yùn)算性能更高。
3. Swift目前存在的缺點(diǎn)
1谜疤、版本不穩(wěn)定佃延,之前升級Swift3大動刀,苦了好多人
2夷磕、使用人數(shù)比例偏低履肃,目前還是OC為主
3、社區(qū)的開源項(xiàng)目偏少坐桩,畢竟OC獨(dú)大好多年尺棋,很多優(yōu)秀的類庫都不支持Swift,不過這種狀況正在改變绵跷,現(xiàn)在有好多優(yōu)秀的Swift的開源類庫了
4膘螟、公司使用的比例不高,很多公司以穩(wěn)為主碾局,還是在使用OC開發(fā)荆残,很少一些在進(jìn)行混合開發(fā),更少一些是純Swift開發(fā)擦俐。
5脊阴、偶爾開發(fā)中遇到的一些問題,很難查找到相關(guān)資料蚯瞧,這是一個(gè)弊端嘿期。
6、純Swift的運(yùn)行時(shí)和OC有本質(zhì)區(qū)別埋合,一些OC中運(yùn)行時(shí)的強(qiáng)大功能备徐,在純Swift中變無效了。
7甚颂、對于不支持Swift的一些第三方類庫蜜猾,如果非得使用,只能混合編程振诬,利用橋接文件實(shí)現(xiàn)蹭睡。
4. Swift其他功能說明
1 Swift的內(nèi)存管理
Swift使用自動引用計(jì)數(shù)(ARC)來簡化內(nèi)存管理,與OC一致赶么。
2 Swift的可選項(xiàng)類型(Optionals)介紹
Swift引入了可選項(xiàng)類型肩豁,用于處理變量值不存在的情況。Optionals類似于OC中指向nil的指針,但是適用于所有數(shù)據(jù)類型清钥,而非僅僅局限于類琼锋,Optionals相比于OC中的nil指針,更加安全和簡明祟昭,并且也是Swift諸多最強(qiáng)大功能的核心缕坎。
3 Swift中的 !和 篡悟?
這兩個(gè)符號是用來標(biāo)記這個(gè)變量的值是否可選谜叹,!表示可選變量必須保證轉(zhuǎn)換能夠成功恰力,否則報(bào)錯(cuò)叉谜,但定義的變量可以直接使用;踩萎?表示可選變量即使轉(zhuǎn)換不成功也不會報(bào)錯(cuò),變量值為nil很钓,如果轉(zhuǎn)換成功香府,要使用該變量時(shí),后面需要加码倦!進(jìn)行修飾企孩。
4 Swift中范型的簡單說明
范型是用來使代碼能安全工作,swift中的范型可以在函數(shù)數(shù)據(jù)和普通數(shù)據(jù)類型中使用袁稽,例如類勿璃、結(jié)構(gòu)體或枚舉。范型可以解決代碼復(fù)用的問題推汽,
5 Swift的訪問權(quán)限變更
swift新增了兩種訪問權(quán)限补疑,權(quán)限更細(xì)化。具體查看這里:
訪問權(quán)限由大到小依次為:open歹撒,public莲组,internal(默認(rèn)),fileprivate暖夭,private
-
fileprivate
在原有的swift中的 private其實(shí)并不是真正的私有锹杈,如果一個(gè)變量定義為private,在同一個(gè)文件中的其他類依然是可以訪問到的迈着。這個(gè)場景在使用extension的時(shí)候很明顯竭望。
這樣帶來了兩個(gè)問題:
(1)當(dāng)我們標(biāo)記為private時(shí),意為真的私有還是文件內(nèi)可共享呢裕菠?
(2)當(dāng)我們?nèi)绻鈭D為真正的私有時(shí)咬清,必須保證這個(gè)類或者結(jié)構(gòu)體在一個(gè)單獨(dú)的文件里。否則可能同文件里其他的代碼訪問到。
由此枫振,在swift 3中喻圃,新增加了一個(gè) fileprivate來顯式的表明,這個(gè)元素的訪問權(quán)限為文件內(nèi)私有粪滤。
過去的private對應(yīng)現(xiàn)在的fileprivate「模現(xiàn)在的private則是真正的私有,離開了這個(gè)類或者結(jié)構(gòu)體的作用域外面就無法訪問杖小。
所以fileprivate > private .
-
open
open則是彌補(bǔ)public語義上的不足肆汹。
現(xiàn)在的pubic有兩層含義:
(1)這個(gè)元素可以在其他作用域被訪問
(2)這個(gè)元素可以在其他作用域被繼承或者override
繼承是一件危險(xiǎn)的事情。尤其對于一個(gè)framework或者module的設(shè)計(jì)者而言予权。在自身的module內(nèi)昂勉,類或者屬性對于作者而言是清晰的,能否被繼承或者override都是可控的扫腺。但是對于使用它的人岗照,作者有時(shí)會希望傳達(dá)出這個(gè)類或者屬性不應(yīng)該被繼承或者修改。這個(gè)對應(yīng)的就是 final笆环。
final的問題在于在標(biāo)記之后攒至,在任何地方都不能override。而對于lib的設(shè)計(jì)者而言躁劣,希望得到的是在module內(nèi)可以被override迫吐,在被import到其他地方后其他用戶使用的時(shí)候不能被override。
通俗的理解public和open就是:
public:可以被任何人訪問账忘,但其他module中不可以被override和繼承志膀,而在本module內(nèi)可以被override和繼承。
open:可以被任何人使用鳖擒,包括override和繼承溉浙。
-
internal
internal是系統(tǒng)默認(rèn)訪問級別,internal修飾符可寫可不寫败去。
(1)internal訪問級別所修飾的屬性或方法在源代碼所在的整個(gè)模塊都可以訪問放航。
(2)如果是框架或者庫代碼,則在整個(gè)框架內(nèi)部都可以訪問圆裕,框架由外部代碼所引用時(shí)广鳍,則不可以訪問。
(3)如果是App代碼吓妆,也是在整個(gè)App代碼赊时,也是在整個(gè)App內(nèi)部可以訪問。
5. Swift Foundation框架
為了方便使用行拢,Swift的基本類型都可以無縫轉(zhuǎn)換到 Foundation 框架中的對應(yīng)類型祖秒。
因?yàn)?Cocoa 框架所接受和返回的基本數(shù)據(jù)類型都是自身框架內(nèi)的類型,也就是 Foundation 中所定義的像 NSString,NSNumber竭缝,NSArray 等這些東西房维。而脫離 Cocoa 框架進(jìn)行 app 開發(fā)是不可能的事情。因此我們在使用 Swift 開發(fā) app 時(shí)無法避免地需要在 Swift 類型和 Foundation 類型間進(jìn)行轉(zhuǎn)換抬纸。如果需要每次顯式地書寫轉(zhuǎn)換的話咙俩,大概就沒人會喜歡用 Swift 了。還好 Swift 與 Foundation 之間的類型轉(zhuǎn)換是可以自動完成的湿故,這使得通過 Swift 使用 Cocoa 時(shí)順暢了很多阿趁。
而且這個(gè)轉(zhuǎn)換不僅是自動的,而且是雙向的坛猪,而且無論何時(shí)只要有可能脖阵,轉(zhuǎn)換的結(jié)果會更傾向于使用 Swift 類型。也就是說墅茉,只要你不寫明類型是需要 NS 開頭的類型的時(shí)候命黔,你都會得到一個(gè) 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. 其他補(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)
常見的如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定義變量
使用常量,更加安全,不能夠被修改,在需要對對象進(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句尾不需要分號 匙隔,除非你想在一行中寫三行代碼就加分號隔開疑苫。
- 3、swift數(shù)據(jù)類型都會自動判斷 , 只區(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)語句中必須加{} 就算只有一行代碼也必須要加
- 7、swift的switch語句后面可以跟各種數(shù)據(jù)類型了 满钟,如Int胜榔、字符串都行,并且里面不用寫break(OC好像不能字符串)
- 8湃番、swift if后的括號可以省略: if a>b {}夭织,而OC里 if后面必須寫括號。
- 9吠撮、swift打印 用print("") 打印變量時(shí)可以 print("(value)")尊惰,不用像OC那樣記很多%@,d%等泥兰。
- 10弄屡、Swift3的【Any】可以代表任何類型的值,無論是類鞋诗、枚舉膀捷、結(jié)構(gòu)體還是任何其他Swift類型,這個(gè)對應(yīng)OC中的【id】類型削彬。
本文內(nèi)容摘自
作者:路飛_Luck
鏈接:http://www.reibang.com/p/3b19b806867b