前言
此Session
進一步講解了關于Swift
語言中的語法特性和設計特點,主要內(nèi)容涉及:
-
Optional
可選類型 - 內(nèi)存管理
- 初始化構造
-
Closures
閉包 - 模式匹配
內(nèi)容
Optionals
針對其值不確定是否存在的變量
Optional
類型來聲明;聲明后存在兩種狀態(tài),一種為有值狀態(tài),另一種為nil
狀態(tài)即無值狀態(tài)(直接聲明為可選類型未設初始值時默認值為nil,其處于第二種狀態(tài))只有可選類型變量才能賦值為
nil
,對于非可選類型(平常的String,Int, Array
,類等)設為nil
會出現(xiàn)編譯錯誤.
讓某一類型變量成為可選類型,在其平常的類型后加?
如Int?, String?, UIVew?
,想要直接獲取其可選類型變量內(nèi)部的值,在其變量名后加!
(強制解包符號),若在其為nil
的情況下進行強制解包會造成運行時錯誤,使用前提必須保證在不為nil
情況下進行取值操作,因此官方不推薦使用!
強制解包符號進行對可選類型變量的取值.代替的方案為使用if-let
句式進行可選綁定操作,利用臨時變量來存可選變量真正的值,形式如下:
if let value = OptionalValue {
print("the real value is \(value)")
} else {
print(it's nil);
}
- 可選鏈,針對在多個可選變量層級獲取情況下所應對的快速簡便語法,形成鏈式語式,其中有一個可選變量為
nil
則無需再向下訪問直接返回nil
,即使最終全程可選類型訪問有效且有值,使用時仍要進行解包操作,其原來返回也是可選類型的變量.
let value = optionalValueA?.optionalValueB?.optionalValueC?.optionalValueD? // still Optional Value`
- 可選類型內(nèi)部結構為一個泛型的枚舉,兩個分支,默認為
None
分支即變量被設為nil
,也可以顯示設置為nil
;另一個則為接受任何類型的變量為關聯(lián)值的Some
分支,使得可選類型變量可以在有值的情況通過解包獲取所存在的值.
enum Optional<T> {
case None
case Some(T)
}
Swift的內(nèi)存管理
繼續(xù)沿用
Objective-C
自動引用計數(shù)機制進行內(nèi)存管理,絕多數(shù)情況下Swift
替開發(fā)者進行內(nèi)存管理;存在強引用的對象的內(nèi)存不會被系統(tǒng)回收,直至該對象上無強引用;
-
應對對象間循環(huán)引用的情況,
Swift
提供兩種解決方法
對應循環(huán)引用-- 使用
weak
關鍵字,使用弱引用指向對象,類似Objective-C
的weak
屬性,在弱引用指向的對象釋放后其原變量會被設為nil
(也說明weak
聲明的變量必須為可選類型且用var
聲明,在賦值、調(diào)用方法時需要解包操作) - 使用
unowned
關鍵字,表示不會對引用計數(shù)進行+1的引用,所引用的對象釋放后也不會被設置為nil
,允許用let
聲明的非可選類型變量,類似于Objective-C
的unsafe_unretain
屬性
- 使用
初始化構造
根本原則: 所有值在對象實例使用前必須都已被初始化(包括設為
nil
).構造方法
init(..){...}
內(nèi)部不允許在所有屬性未初始化前調(diào)用方法(內(nèi)部的方法調(diào)用實則隱式的self
實例調(diào)用,違背構造根本原則)結構體:
能自動生成構造方法;
若存在沒有初始化或無默認值的屬性,會生成相應的構造方法設置其屬性的初始值;類:
由于繼承的特性,構造方法被繼承時,需要使用super
調(diào)用,注意調(diào)用時機,在所有本類屬性初始化后才能進行父類初始化方法調(diào)用.
允許在調(diào)用父類初始化方法后,進行對繼承的屬性進行再一次修改和操作.
類的初始化方法分為Designated
和Convenience
兩種,若存在父類,Designated
構造方法都要調(diào)用其父類的Designated
構造方法,而Convenience
構造方法還是依靠Designated
構造方法進行實例初始化;
有繼承的類在所有屬性都已有初始值的情況下,允許不實現(xiàn)自己的構造方法,自動繼承父類的所有Designated
和Convenience
構造方法,若自己定義了構造方法,則不會繼承父類的構造方法;屬性的懶加載: 想讓編譯器知道該屬性只有到需要訪問時才會初始化使用
@lazy
關鍵字,并賦值為初始化完整的實例@lazy var manager = Manager()
析構方法:一般移除KOV或者通知的觀察者,關閉文件,釋放資源時才會用到.
閉包
一般寫法
let closure = { (a, b) -> Bool in
return true
}
標準庫閉包
- sort 排序閉包
- filter 過濾閉包
- map 映射閉包
- reduce 折合閉包
值捕獲:
能自動獲取上下文變量,進行訪問和設置.
閉包和函數(shù)都是一種ARC對象,內(nèi)部能引用和持有其他ARC對象,支持ARC內(nèi)存管理機制
在值捕獲過程中產(chǎn)生的循環(huán)引用,應對方法使用unowned
關鍵字
模式匹配
-
Switch
支持類實例對象,數(shù)據(jù)范圍的匹配 - 枚舉允許設置關聯(lián)值,結合
Switch
,訪問關聯(lián)值 - 提供元組匹配,在
switch
中使用元組作為分支,并且支持where
的額外條件匹配
結尾
整體看下來,體會到了Swfit
語言對安全性和便利性的不斷追求,不論從使用可選類型,遵循構造方法原則都體現(xiàn)著Swift
安全這一特性,目的就是為了讓開發(fā)者能更加安全,有效地編碼.