Swift和OC共用一套運(yùn)行時(shí)環(huán)境逊脯,Swift的類型可以橋接到OC,反之亦然竣贪。兩者可以互相引用混合編程军洼。
Swift新出的一些新興概念,這些是OC沒(méi)有的贾富,比如泛型歉眷、元組等牺六。
優(yōu)點(diǎn)
- 簡(jiǎn)潔的語(yǔ)法颤枪,性能較好
swift比OC精簡(jiǎn),整個(gè)項(xiàng)目少了.h文件淑际,以及頭文件的引入畏纲,效率提升1.3倍。 - swift更加安全
類型安全的語(yǔ)言春缕,可選類型盗胀,強(qiáng)制解包等 if let,guard let锄贼。 - 定義變量簡(jiǎn)單
定義變量不區(qū)分整型票灰,浮點(diǎn)型等,變量使用var,常量使用let屑迂。 - 函數(shù)式編程的支持
filter浸策,map,reduce惹盼,flatMap庸汗,compactMap等。
swift本身提供了對(duì)函數(shù)式編程的支持手报,OC本身是不支持的蚯舱,需要引入ReactiveCocoa這個(gè)庫(kù)才支持。 - 可視化互動(dòng)效果
開發(fā)工具帶來(lái)了Xcode Playgrounds功能掩蛤,該功能提供強(qiáng)大的互動(dòng)效果枉昏,能讓swift源代碼在撰寫過(guò)程中實(shí)時(shí)顯示出其運(yùn)行結(jié)果。 - 精準(zhǔn)報(bào)錯(cuò)
報(bào)錯(cuò)的時(shí)候直接顯示報(bào)錯(cuò)行盏档。
缺點(diǎn)
- 版本不穩(wěn)定凶掰。
- 使用比例偏低。
- swift開源庫(kù)較少蜈亩,不過(guò)正在改變中懦窘。
- App體積變大,多出5~8M稚配,由于版本不穩(wěn)定畅涂,iOS系統(tǒng)庫(kù)中并沒(méi)有包含swift的運(yùn)行庫(kù),反而是每個(gè)App都要包含其對(duì)應(yīng)的swift運(yùn)行庫(kù)道川。
- 公司使用比例不高午衰,很多公司以穩(wěn)為主,很少一些在進(jìn)行混合開發(fā)冒萄,更少一些是swift開發(fā)臊岸。
- 純swift的運(yùn)行時(shí)和OC有本質(zhì)區(qū)別,一些OC中強(qiáng)大的運(yùn)行時(shí)功能尊流,在純swift中變無(wú)效了帅戒。
1. swift可選類型
swift引入可選類型,用于處理變量值不存在的情況崖技,Optionals類似于OC中指向nil的指針逻住,但是適用于所有數(shù)據(jù)類型,而非僅僅局限于類迎献,Options相比于OC中nil指針瞎访,更加安全和簡(jiǎn)明,并且也是Swift諸多強(qiáng)大功能的核心吁恍。
2. swift中泛型
解決代碼復(fù)用問(wèn)題
例如兩個(gè)方法類似扒秸,主要是參數(shù)類型的區(qū)別
func isIntEqual(x: Int, y: Int) -> Bool {
return x == y
}
func isStringEqual(x: Int, y: Int) -> Bool {
return x == y
}
可以利用泛型合并一下:
func isObjEqual<T: Equaltable>(x: T, y: T) -> Bool {
return x == y
}
當(dāng)使用時(shí)播演,如果將兩個(gè)不同類型的數(shù)進(jìn)行比較,編譯器會(huì)馬上提醒我們伴奥,從而快速避免這種情況宾巍。
3. 訪問(wèn)權(quán)限變更
swift新增兩種權(quán)限,fileprivate渔伯,open顶霞,權(quán)限更細(xì)化。
open锣吼、public选浑、internal(默認(rèn))、fileprivate玄叠、private
開放權(quán)限依次從大到小
- open:可以被任何人使用古徒,包括override和繼承。
- public:可以被任何人訪問(wèn)读恃,但其他module中不可以被override和繼承隧膘,在本module中可以被override和繼承。
- internal:系統(tǒng)默認(rèn)訪問(wèn)級(jí)別寺惫,internal修飾符可寫可不寫疹吃,訪問(wèn)級(jí)別所修飾的屬性或方法在源代碼所在的整個(gè)模塊都可以訪問(wèn)。
如果是框架或者庫(kù)代碼西雀,則整個(gè)框架內(nèi)部都可以訪問(wèn)萨驶,框架由外部代碼所引用時(shí),則不可以訪問(wèn)艇肴。
如果是App代碼腔呜,也是在這個(gè)App代碼,也是整個(gè)App內(nèi)部可以訪問(wèn)再悼。 - fileprivate:表示這個(gè)元素的訪問(wèn)權(quán)限為文件內(nèi)私有核畴,包括extension時(shí)可以訪問(wèn)
- private:只在當(dāng)前類或結(jié)構(gòu)體的作用域可訪問(wèn)。
4.Swift便捷的函數(shù)式編程
4.1冲九、map
var values = [1, 3, 5, 7]
let result = values.map( { (element) -> Int in
return element * 2
}) // [2, 6, 10, 14]
4.2谤草、filter
var result = [1, 3, 5, 7, 9]
let flattenResult = result.filter{ $0 % 3 == 0 }
// [3, 9]
4.3、reduce
var result = [1, 3, 5]
let initialResult = 10
var reduceResult = values.reduce(initialResult, combine: { $0 + $1 })
print(reduceResult) // 10 + 1 + 3 + 5 = 19
4.4娘侍、flatMap(合并集合)
let arrayNumbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(arrayNumbers.flatMap{ $0 }) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(arrayNumbers.flatMap{ $0.map{ $0 *10 } }) // [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(arrayNumbers.flatMap{ $0.filter{ $0 > 4 } }) // [5, 6, 7, 8, 9]
4.5咖刃、compactMap(過(guò)濾空值)
let names: [String?] = ["zhangsan", nil, "lisi", "wangwu", nil, "zhaoliu"]
print(names.count) // 6
print(names.compactMap{ $0 }) // ["zhangsan", "lisi", "wangwu", "zhaoliu"] 過(guò)濾了空值
// 打印不是空值的字符串的個(gè)數(shù)
print(names.compactMap{ $0?.count }) // [8, 4, 6, 7]
5. Swift獨(dú)有的元組類型
元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值泳炉。元組內(nèi)的值可以是任意類型憾筏,并不要求相同類型。
var value = (Int, String) = (x: 15, y: "abc")
6. Swift中使用let定義常量花鹅,var定義變量
使用常量氧腰,更加安全,不能夠被修改。
在需要對(duì)對(duì)象進(jìn)行修改的時(shí)候古拴,只能用var修飾箩帚。
7. 細(xì)節(jié)使用區(qū)別
- swift不區(qū)分.h和.m,一個(gè)類只有.swift一個(gè)文件黄痪,所以整體的文件數(shù)量比起OC有一定的減少紧帕。
- swift句尾不需要分號(hào),除非想在一行中寫三行代碼桅打,加分號(hào)隔開是嗜。
- swift數(shù)據(jù)類型都會(huì)自動(dòng)判斷,只區(qū)分常量let和變量var挺尾。
- 強(qiáng)制類型轉(zhuǎn)換格式不同鹅搪,OC強(qiáng)轉(zhuǎn):(Int)a。swift:Int(a)遭铺。
- 關(guān)于BOOL類型更加嚴(yán)格丽柿,swift不再是OC的非0就是真,而是true才是真魂挂,false才是假甫题。
- swift循環(huán)語(yǔ)句中必須加{},就算只有一行也要加涂召。
- swift的swift語(yǔ)句后面可以跟各種數(shù)據(jù)類型幔睬,如Int,字符串都行芹扭,并且里面不需要寫break麻顶。
- swift if后的括號(hào)可以省略,if a > b {}舱卡,而OC里if后面必須寫括號(hào)辅肾。
- swift打印用 print("")打印變量可以 print("(value)")不用像oc一樣寫很多%d,%@等。
- swift的【Any】可以代表任意類型的值轮锥,無(wú)論是類矫钓、枚舉、結(jié)構(gòu)體還是其它swift類型舍杜,這個(gè)對(duì)應(yīng)OC中的【id】類型新娜。