主要體現(xiàn)在類(lèi)型安全会放、運(yùn)行安全、內(nèi)存安全等方面
Swift是靜態(tài)語(yǔ)言
靜態(tài)語(yǔ)言編寫(xiě)的程序诫隅,在編譯完成后就已確定腐魂,不能再拓展更改,相對(duì)于動(dòng)態(tài)語(yǔ)言來(lái)說(shuō)逐纬,雖然缺失了一些靈活性蛔屹,但是更加安全。
但是Swift也可以用OC的運(yùn)行時(shí)特性豁生。
Swift有完善的類(lèi)型診斷(OC類(lèi)型診斷較弱)
任何變量兔毒,都必須有確定的類(lèi)型漫贞,且類(lèi)型一旦確定,不可更改:
對(duì)于不明確指定類(lèi)型的變量育叁,變量聲明時(shí)必須進(jìn)行初始化迅脐;
//會(huì)報(bào)錯(cuò)Type annotation missing in pattern
//var a1
var a = "12"
// 會(huì)報(bào)錯(cuò)Cannot assign value of type 'Int' to type 'String'
//a = 12
而OC中一個(gè)引用類(lèi)型變量,可以指向任意的其他類(lèi)型變量擂红,比如一個(gè)聲明為NSString的變量仪际,賦值一個(gè)NSNubmer的對(duì)象,編譯器不會(huì)報(bào)錯(cuò)昵骤,但是實(shí)際運(yùn)行過(guò)程中树碱,由于這個(gè)變量的聲明時(shí)NSString類(lèi)型,所以只能通過(guò)NSString類(lèi)型提供的方法進(jìn)行訪問(wèn)操作变秦,但變量實(shí)際指向的對(duì)象是NSNumber類(lèi)型成榜,NSString類(lèi)型的方法是找不到的,所以會(huì)發(fā)生異常蹦玫,
尤其是網(wǎng)絡(luò)數(shù)據(jù)解析的時(shí)候赎婚,經(jīng)常可能碰到樱溉,解析出一個(gè)NSNull對(duì)象挣输,被賦值給一個(gè)NSString變量
2、可選性的定義福贞,使得開(kāi)發(fā)者必須去考慮空的情況
在OC中撩嚼,任何變量的聲明,可以不賦初值挖帘,對(duì)應(yīng)基礎(chǔ)數(shù)據(jù)類(lèi)型完丽,如int,會(huì)有默認(rèn)值0拇舀,對(duì)于引用類(lèi)型變量逻族,則默認(rèn)值為nil
引用類(lèi)型中,對(duì)nil進(jìn)行任何方法訪問(wèn)骄崩,都是不會(huì)報(bào)錯(cuò)的
但是在Swift中聘鳞,如果一個(gè)變量,不是可選性刁赖,那么一定是有值的搁痛,而且類(lèi)型確定,通過(guò)它的類(lèi)型去訪問(wèn)不會(huì)有問(wèn)題宇弛。
但是如果一個(gè)變量鸡典,是可選性,那么它可能是nil枪芒,可能是沒(méi)有值
對(duì)于可選性變量的訪問(wèn)彻况,Swift提供了多種解包方式谁尸,必須用這些解包方式直接或者間接的解包后,去訪問(wèn)它的屬性或方法纽甘,
這提供了一種機(jī)制良蛮,如果是nil,則不會(huì)繼續(xù)訪問(wèn)悍赢,不是nil决瞳,才會(huì)訪問(wèn)
附常用解包方式:
(1)! 強(qiáng)制解包错忱,如果為空陨簇,則會(huì)崩潰
(2)? 解包
(3)?? 解包糟把,通常用來(lái)提供默認(rèn)值
(4)if let解包
(5)guard let解包
(6)自動(dòng)解包:變量聲明時(shí)冠句,如 var test: String!,這樣在使用的時(shí)候艘希,就會(huì)自動(dòng)解包(與?修飾的區(qū)別是届良,?修飾的還需要手動(dòng)解包)竟贯,但是需要注意的是锌杀,我們需確保這個(gè)變量甩栈,在使用的時(shí)候,不是為nil的
Swift中有明確的初始化機(jī)制(非可選型變量)
前面說(shuō)到糕再,一個(gè)不明確類(lèi)型的變量量没,必須聲明時(shí)初始化
但是對(duì)于一個(gè)顯示聲明類(lèi)型的變量,要看它所在位置突想;
1允蜈、全局變量、局部變量(函數(shù)中)
必須聲明的同時(shí)蒿柳,進(jìn)行初始化
2、成員變量(struct或class的屬性)
(1)可以在聲明的同時(shí)漩蟆,進(jìn)行初始化賦初值
(2)如果聲明時(shí)不賦初值垒探,那么要在構(gòu)造器中進(jìn)行初始化賦初值
Swift注重值類(lèi)型,降低了內(nèi)存泄漏的風(fēng)險(xiǎn)
在Swift中怠李,常用的內(nèi)建數(shù)據(jù)類(lèi)型圾叼,如Array、Dictionary捺癞、Set等夷蚊,都設(shè)計(jì)為值類(lèi)型,由此可見(jiàn)Swift對(duì)值類(lèi)型的注重髓介,并且還提供了值類(lèi)型寫(xiě)時(shí)復(fù)制機(jī)制惕鼓,優(yōu)化了值類(lèi)型的內(nèi)存管理。
值類(lèi)型存儲(chǔ)在棧中唐础,沒(méi)有引用計(jì)數(shù)箱歧,由系統(tǒng)管理內(nèi)存矾飞,很大程度是降低了開(kāi)發(fā)者編碼內(nèi)存泄漏的風(fēng)險(xiǎn)。
引用類(lèi)型存儲(chǔ)在堆中呀邢,雖然有ARC機(jī)制洒沦,但是開(kāi)發(fā)者對(duì)依舊其內(nèi)存管理的干預(yù)較大,一定程度上增加了內(nèi)存泄漏的風(fēng)險(xiǎn)价淌。
Swift閉包類(lèi)型的明確劃分申眼,也一定程度上降低了內(nèi)存泄漏的風(fēng)險(xiǎn)
Swift中對(duì)閉包有較為明確的區(qū)分,有專(zhuān)屬的關(guān)鍵字蝉衣。
非逃逸閉包括尸,是生命周期同方法的作用域一致的閉包,當(dāng)方法調(diào)用結(jié)束买乃,閉包就被釋放姻氨,同時(shí)閉包所捕獲的實(shí)例或引用也會(huì)被釋放。
逃逸閉包剪验,也就是閉包的生命周期逃逸出方法的作用域肴焊,這個(gè)時(shí)候就要注意其捕獲的實(shí)例是否會(huì)導(dǎo)致內(nèi)存泄漏問(wèn)題。Swift通過(guò)這兩個(gè)關(guān)鍵字提醒開(kāi)發(fā)者注意內(nèi)存泄漏問(wèn)題功戚。