Swift從2014年WWDC發(fā)布以來(lái)族沃,已經(jīng)經(jīng)歷了兩年多,版本更新到了3.0泌参。這個(gè)蘋果推出的新語(yǔ)言脆淹,引發(fā)了一波開發(fā)者的高潮,高潮過(guò)去及舍,在國(guó)內(nèi)沒(méi)起什么大的波瀾未辆。據(jù)我觀察主要兩個(gè)原因,公司項(xiàng)目不支持和版本不穩(wěn)定锯玛。但是從蘋果方面而言咐柜,用Swift取代OC只是時(shí)間問(wèn)題。這幾個(gè)版本的迭代攘残,解決了很多兼容問(wèn)題拙友,優(yōu)化了很多語(yǔ)法。
Swift一出生就攜有很多語(yǔ)言的優(yōu)秀基因歼郭,避開了很多語(yǔ)言的坑(尤其是OC)遗契,提高了開發(fā)者的編寫效率,它的語(yǔ)法簡(jiǎn)潔且嚴(yán)謹(jǐn)病曾,融合了很多語(yǔ)言的特色和優(yōu)點(diǎn)牍蜂,因此你會(huì)看到很多語(yǔ)言的影子。未來(lái)幾年泰涂,Swift將會(huì)變的越來(lái)越流行鲫竞,也會(huì)越來(lái)越重要。因?yàn)閖ava版權(quán)的原因逼蒙,谷歌已經(jīng)醞釀將Swift作為安卓開發(fā)語(yǔ)言(點(diǎn)擊鏈接)从绘,IBM云平臺(tái)開始支持Swift,影響力如此大的兩家公司加入陣營(yíng),相信其他公司不久也會(huì)緊隨其后僵井。
我將Swift的語(yǔ)法優(yōu)勢(shì)(主要相比較OC而言)陕截,總結(jié)出以下幾點(diǎn)。
1.簡(jiǎn)潔
舉個(gè)實(shí)際使用最多的例子:?jiǎn)卫?br> 如果用OC寫單例的代碼如下:
static Singleton *sharedSingleton = nil;
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^ {
sharedSingleton = [[self alloc] init] ;
}) ;
return sharedSingleton ;
}
如果用Swift實(shí)現(xiàn)的話
static let sharedInstance : Singleton = {
let instance = Singleton()
return instance
}()
或者
static let sharedInstance = Singeton()
2.類型安全
Swift3.0開始批什,無(wú)論高精度->低精度农曲,還是低精度->高精度,包括向上轉(zhuǎn)換和向下轉(zhuǎn)換渊季,都需要顯式轉(zhuǎn)換朋蔫。
3.可選類型
變量常量不接受空值,如果可能出現(xiàn)空值的情況下使用可選類型却汉。
4.類型推導(dǎo)
Swift可以根據(jù)上下文推導(dǎo)出常量或變量的類型驯妄,不用特意聲明。
let intNumber = 2
let doubleNumber = 2.0
根據(jù)所賦的值自動(dòng)推導(dǎo)出intNumber是Int類型合砂,doubleNumber是Double類型
5.guard語(yǔ)句代替if的多層嵌套
有些時(shí)候青扔,我們實(shí)現(xiàn)的某條功能路徑,需要滿足好幾個(gè)條件翩伪,代碼要一層層嵌套微猖。
比如:
if (username) {
if (password) {
if (verification_code) {
NSLog(@"登錄成功");
} else {
NSLog(@"登陸失敗");
}
} else {
NSLog(@"登陸失敗");
}
} else {
NSLog(@"登陸失敗");
}
用Swift表達(dá)
guard username == true, password == true, verification_code == true else {
NSLog("登錄失敗")
}
NSLog("登錄成功")
guard后面的條件,只有全部滿足了缘屹,代碼執(zhí)行才會(huì)往下走凛剥,否則進(jìn)入{}內(nèi)。它會(huì)提早判斷不滿足判斷條件的情況轻姿。
6.結(jié)構(gòu)體默認(rèn)有遍歷構(gòu)造函數(shù)
圖中可以看到自動(dòng)生成了一個(gè)能夠初始化它所有屬性的構(gòu)造函數(shù)
7.延遲屬性
延遲加載屬性犁珠,僅需要加個(gè)關(guān)鍵字即可
lazy let files = readData()
實(shí)例化時(shí),不會(huì)初始化它互亮,只有調(diào)用它的時(shí)候犁享,才會(huì)初始化。
8.計(jì)算屬性
專門負(fù)責(zé)計(jì)算的一個(gè)微型的方法豹休,他有set和get方法炊昆,一個(gè)負(fù)責(zé)設(shè)置值,一個(gè)負(fù)責(zé)獲取值
9.屬性觀察器
觀察儲(chǔ)存屬性的變化威根,可在其變化前和變化后做相應(yīng)的處理
10.不用頻繁寫import
同一個(gè)工程的文件相互之間引用凤巨,不用導(dǎo)入
11.簡(jiǎn)潔的閉包
12.功能更強(qiáng)大的switch
- switch語(yǔ)句不再只應(yīng)用于離散的整數(shù),還應(yīng)用于數(shù)值范圍洛搀、浮點(diǎn)數(shù)敢茁、字符、字符串
- 每條語(yǔ)句姥卢,不用寫 break卷要,編譯器會(huì)自動(dòng)添加
- 單個(gè)case多個(gè)匹配值
13.泛型
編寫一個(gè)方法適用于多種數(shù)據(jù)類型參數(shù)的處理,或暫時(shí)確定不了參數(shù)數(shù)據(jù)類型独榴,可以使用泛型語(yǔ)法代替參數(shù)數(shù)據(jù)類型僧叉。
比如有個(gè)方法,把a(bǔ)的值給b棺榔,b的值給a瓶堕,這種調(diào)換不僅限于int,double症歇,還適用于字符串或字符以及數(shù)組等郎笆。
func swap<T>(outA a: T, outB b: T) {
var c = a
a = b
b = c
}
“<T>”,尖括號(hào)內(nèi)的T就代表泛型
可以出現(xiàn)在集合忘晤、數(shù)組宛蚓、字典,類设塔、結(jié)構(gòu)體和枚舉中
14.枚舉可關(guān)聯(lián)值
打個(gè)比方凄吏,如果你做個(gè)計(jì)算機(jī)demo,要對(duì)計(jì)算進(jìn)行壓棧闰蛔,壓棧的內(nèi)容痕钢,無(wú)非操作數(shù)、一元運(yùn)算符以及二元運(yùn)算符序六,這里就可以聲明一個(gè)枚舉任连,關(guān)聯(lián)上數(shù)據(jù)類型。
操作數(shù)只需要一個(gè)double例诀,一元和二元運(yùn)算符關(guān)聯(lián)一個(gè)要選用的運(yùn)算符(“+”随抠、“-”等等)的字符串,以及一個(gè)運(yùn)算方法的閉包余佃。
15.命名空間
命名空間關(guān)鍵字適用于方法和屬性
- private
- internal(默認(rèn))
- public
16.Swift和oc混編
需要橋接頭文件和保護(hù)傘頭文件
歡迎指正和補(bǔ)充暮刃。