主要體現(xiàn)在類型安全、運行安全、內(nèi)存安全等方面
Swift是靜態(tài)語言
靜態(tài)語言編寫的程序,在編譯完成后就已確定,不能再拓展更改,相對于動態(tài)語言來說,雖然缺失了一些靈活性,但是更加安全。
但是Swift也可以用OC的運行時特性。
Swift有完善的類型診斷(OC類型診斷較弱)
任何變量,都必須有確定的類型,且類型一旦確定,不可更改:
對于不明確指定類型的變量,變量聲明時必須進(jìn)行初始化;
//會報錯Type annotation missing in pattern
//var a1
var a = "12"
// 會報錯Cannot assign value of type 'Int' to type 'String'
//a = 12
而OC中一個引用類型變量,可以指向任意的其他類型變量,比如一個聲明為NSString的變量,賦值一個NSNubmer的對象,編譯器不會報錯,但是實際運行過程中,由于這個變量的聲明時NSString類型,所以只能通過NSString類型提供的方法進(jìn)行訪問操作,但變量實際指向的對象是NSNumber類型,NSString類型的方法是找不到的,所以會發(fā)生異常,
尤其是網(wǎng)絡(luò)數(shù)據(jù)解析的時候,經(jīng)??赡芘龅?,解析出一個NSNull對象,被賦值給一個NSString變量
2、可選性的定義,使得開發(fā)者必須去考慮空的情況
在OC中,任何變量的聲明,可以不賦初值,對應(yīng)基礎(chǔ)數(shù)據(jù)類型,如int,會有默認(rèn)值0,對于引用類型變量,則默認(rèn)值為nil
引用類型中,對nil進(jìn)行任何方法訪問,都是不會報錯的
但是在Swift中,如果一個變量,不是可選性,那么一定是有值的,而且類型確定,通過它的類型去訪問不會有問題。
但是如果一個變量,是可選性,那么它可能是nil,可能是沒有值
對于可選性變量的訪問,Swift提供了多種解包方式,必須用這些解包方式直接或者間接的解包后,去訪問它的屬性或方法,
這提供了一種機(jī)制,如果是nil,則不會繼續(xù)訪問,不是nil,才會訪問
附常用解包方式:
(1)! 強(qiáng)制解包,如果為空,則會崩潰
(2)? 解包
(3)?? 解包,通常用來提供默認(rèn)值
(4)if let解包
(5)guard let解包
(6)自動解包:變量聲明時,如 var test: String!,這樣在使用的時候,就會自動解包(與?修飾的區(qū)別是,?修飾的還需要手動解包),但是需要注意的是,我們需確保這個變量,在使用的時候,不是為nil的
Swift中有明確的初始化機(jī)制(非可選型變量)
前面說到,一個不明確類型的變量,必須聲明時初始化
但是對于一個顯示聲明類型的變量,要看它所在位置;
1、全局變量、局部變量(函數(shù)中)
必須聲明的同時,進(jìn)行初始化
2、成員變量(struct或class的屬性)
(1)可以在聲明的同時,進(jìn)行初始化賦初值
(2)如果聲明時不賦初值,那么要在構(gòu)造器中進(jìn)行初始化賦初值
Swift注重值類型,降低了內(nèi)存泄漏的風(fēng)險
在Swift中,常用的內(nèi)建數(shù)據(jù)類型,如Array、Dictionary、Set等,都設(shè)計為值類型,由此可見Swift對值類型的注重,并且還提供了值類型寫時復(fù)制機(jī)制,優(yōu)化了值類型的內(nèi)存管理。
值類型存儲在棧中,沒有引用計數(shù),由系統(tǒng)管理內(nèi)存,很大程度是降低了開發(fā)者編碼內(nèi)存泄漏的風(fēng)險。
引用類型存儲在堆中,雖然有ARC機(jī)制,但是開發(fā)者對依舊其內(nèi)存管理的干預(yù)較大,一定程度上增加了內(nèi)存泄漏的風(fēng)險。
Swift閉包類型的明確劃分,也一定程度上降低了內(nèi)存泄漏的風(fēng)險
Swift中對閉包有較為明確的區(qū)分,有專屬的關(guān)鍵字。
非逃逸閉包,是生命周期同方法的作用域一致的閉包,當(dāng)方法調(diào)用結(jié)束,閉包就被釋放,同時閉包所捕獲的實例或引用也會被釋放。
逃逸閉包,也就是閉包的生命周期逃逸出方法的作用域,這個時候就要注意其捕獲的實例是否會導(dǎo)致內(nèi)存泄漏問題。Swift通過這兩個關(guān)鍵字提醒開發(fā)者注意內(nèi)存泄漏問題。