WWDC之Intermediate to Swift

前言

Session進一步講解了關于Swift語言中的語法特性和設計特點,主要內(nèi)容涉及:

  • Optional可選類型
  • 內(nèi)存管理
  • 初始化構造
  • Closures閉包
  • 模式匹配

內(nèi)容

Optionals

Optional總覽
  • 針對其值不確定是否存在的變量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)
}
演講者對`Optional`變量的形象比喻

Swift的內(nèi)存管理

內(nèi)存管理總覽
  • 繼續(xù)沿用Objective-C自動引用計數(shù)機制進行內(nèi)存管理,絕多數(shù)情況下Swift替開發(fā)者進行內(nèi)存管理;

  • 存在強引用的對象的內(nèi)存不會被系統(tǒng)回收,直至該對象上無強引用;

  • 應對對象間循環(huán)引用的情況,Swift提供兩種解決方法

    對應循環(huán)引用-

    • 使用weak關鍵字,使用弱引用指向對象,類似Objective-Cweak屬性,在弱引用指向的對象釋放后其原變量會被設為nil(也說明weak聲明的變量必須為可選類型且用var聲明,在賦值、調(diào)用方法時需要解包操作)
    • 使用unowned關鍵字,表示不會對引用計數(shù)進行+1的引用,所引用的對象釋放后也不會被設置為nil,允許用let聲明的非可選類型變量,類似于Objective-Cunsafe_unretain屬性

初始化構造

初始化總覽
  • 根本原則: 所有值在對象實例使用前必須都已被初始化(包括設為nil).

  • 構造方法init(..){...} 內(nèi)部不允許在所有屬性未初始化前調(diào)用方法(內(nèi)部的方法調(diào)用實則隱式的self實例調(diào)用,違背構造根本原則)

  • 結構體:
    能自動生成構造方法;
    若存在沒有初始化或無默認值的屬性,會生成相應的構造方法設置其屬性的初始值;

  • 類:
    由于繼承的特性,構造方法被繼承時,需要使用super調(diào)用,注意調(diào)用時機,在所有本類屬性初始化后才能進行父類初始化方法調(diào)用.
    允許在調(diào)用父類初始化方法后,進行對繼承的屬性進行再一次修改和操作.
    類的初始化方法分為DesignatedConvenience兩種,若存在父類,Designated構造方法都要調(diào)用其父類的Designated構造方法,而Convenience構造方法還是依靠Designated構造方法進行實例初始化;
    有繼承的類在所有屬性都已有初始值的情況下,允許不實現(xiàn)自己的構造方法,自動繼承父類的所有DesignatedConvenience構造方法,若自己定義了構造方法,則不會繼承父類的構造方法;

  • 屬性的懶加載: 想讓編譯器知道該屬性只有到需要訪問時才會初始化使用@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關鍵字

應對循環(huán)應用二

模式匹配

模式匹配總覽
  • Switch支持類實例對象,數(shù)據(jù)范圍的匹配
  • 枚舉允許設置關聯(lián)值,結合Switch,訪問關聯(lián)值
  • 提供元組匹配,在switch中使用元組作為分支,并且支持where的額外條件匹配

結尾

整體看下來,體會到了Swfit語言對安全性和便利性的不斷追求,不論從使用可選類型,遵循構造方法原則都體現(xiàn)著Swift安全這一特性,目的就是為了讓開發(fā)者能更加安全,有效地編碼.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容