Swift優(yōu)缺點(diǎn)

Swift和OC共用一套運(yùn)行時(shí)環(huán)境,Swift的類(lèi)型可以橋接到OC,反之亦然。兩者可以互相引用混合編程。
Swift新出的一些新興概念,這些是OC沒(méi)有的,比如泛型、元組等。
優(yōu)點(diǎn)

  1. 簡(jiǎn)潔的語(yǔ)法,性能較好
    swift比OC精簡(jiǎn),整個(gè)項(xiàng)目少了.h文件,以及頭文件的引入,效率提升1.3倍。
  2. swift更加安全
    類(lèi)型安全的語(yǔ)言,可選類(lèi)型,強(qiáng)制解包等 if let,guard let。
  3. 定義變量簡(jiǎn)單
    定義變量不區(qū)分整型,浮點(diǎn)型等,變量使用var,常量使用let。
  4. 函數(shù)式編程的支持
    filter,map,reduce,flatMap,compactMap等。
    swift本身提供了對(duì)函數(shù)式編程的支持,OC本身是不支持的,需要引入ReactiveCocoa這個(gè)庫(kù)才支持。
  5. 可視化互動(dòng)效果
    開(kāi)發(fā)工具帶來(lái)了Xcode Playgrounds功能,該功能提供強(qiáng)大的互動(dòng)效果,能讓swift源代碼在撰寫(xiě)過(guò)程中實(shí)時(shí)顯示出其運(yùn)行結(jié)果。
  6. 精準(zhǔn)報(bào)錯(cuò)
    報(bào)錯(cuò)的時(shí)候直接顯示報(bào)錯(cuò)行。

缺點(diǎn)

  1. 版本不穩(wěn)定。
  2. 使用比例偏低。
  3. swift開(kāi)源庫(kù)較少,不過(guò)正在改變中。
  4. App體積變大,多出5~8M,由于版本不穩(wěn)定,iOS系統(tǒng)庫(kù)中并沒(méi)有包含swift的運(yùn)行庫(kù),反而是每個(gè)App都要包含其對(duì)應(yīng)的swift運(yùn)行庫(kù)。
  5. 公司使用比例不高,很多公司以穩(wěn)為主,很少一些在進(jìn)行混合開(kāi)發(fā),更少一些是swift開(kāi)發(fā)。
  6. 純swift的運(yùn)行時(shí)和OC有本質(zhì)區(qū)別,一些OC中強(qiáng)大的運(yùn)行時(shí)功能,在純swift中變無(wú)效了。

1. swift可選類(lèi)型

swift引入可選類(lèi)型,用于處理變量值不存在的情況,Optionals類(lèi)似于OC中指向nil的指針,但是適用于所有數(shù)據(jù)類(lèi)型,而非僅僅局限于類(lèi),Options相比于OC中nil指針,更加安全和簡(jiǎn)明,并且也是Swift諸多強(qiáng)大功能的核心。

2. swift中泛型

解決代碼復(fù)用問(wèn)題
例如兩個(gè)方法類(lèi)似,主要是參數(shù)類(lèi)型的區(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è)不同類(lèi)型的數(shù)進(jìn)行比較,編譯器會(huì)馬上提醒我們,從而快速避免這種情況。

3. 訪問(wèn)權(quán)限變更

swift新增兩種權(quán)限,fileprivate,open,權(quán)限更細(xì)化。
open、public、internal(默認(rèn))、fileprivate、private
開(kāi)放權(quán)限依次從大到小

  • open:可以被任何人使用,包括override和繼承。
  • public:可以被任何人訪問(wèn),但其他module中不可以被override和繼承,在本module中可以被override和繼承。
  • internal:系統(tǒng)默認(rèn)訪問(wèn)級(jí)別,internal修飾符可寫(xiě)可不寫(xiě),訪問(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)前類(lèi)或結(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ú)有的元組類(lèi)型

元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值。元組內(nèi)的值可以是任意類(lèi)型,并不要求相同類(lèi)型。

var value = (Int, String) = (x: 15, y: "abc")

6. Swift中使用let定義常量,var定義變量

使用常量,更加安全,不能夠被修改。
在需要對(duì)對(duì)象進(jìn)行修改的時(shí)候,只能用var修飾。

7. 細(xì)節(jié)使用區(qū)別

  1. swift不區(qū)分.h和.m,一個(gè)類(lèi)只有.swift一個(gè)文件,所以整體的文件數(shù)量比起OC有一定的減少。
  2. swift句尾不需要分號(hào),除非想在一行中寫(xiě)三行代碼,加分號(hào)隔開(kāi)。
  3. swift數(shù)據(jù)類(lèi)型都會(huì)自動(dòng)判斷,只區(qū)分常量let和變量var。
  4. 強(qiáng)制類(lèi)型轉(zhuǎn)換格式不同,OC強(qiáng)轉(zhuǎn):(Int)a。swift:Int(a)。
  5. 關(guān)于BOOL類(lèi)型更加嚴(yán)格,swift不再是OC的非0就是真,而是true才是真,false才是假。
  6. swift循環(huán)語(yǔ)句中必須加{},就算只有一行也要加。
  7. swift的swift語(yǔ)句后面可以跟各種數(shù)據(jù)類(lèi)型,如Int,字符串都行,并且里面不需要寫(xiě)break。
  8. swift if后的括號(hào)可以省略,if a > b {},而OC里if后面必須寫(xiě)括號(hào)。
  9. swift打印用 print("")打印變量可以 print("(value)")不用像oc一樣寫(xiě)很多%d,%@等。
  10. swift的【Any】可以代表任意類(lèi)型的值,無(wú)論是類(lèi)、枚舉、結(jié)構(gòu)體還是其它swift類(lèi)型,這個(gè)對(duì)應(yīng)OC中的【id】類(lèi)型。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容