swift中的枚舉可以用復雜的類型如下见间,關聯(lián)值:
在Swift中進行枚舉布局的時候一直是嘗試使用最少的空間來存儲enum前计,對于當前的case數量來說供搀,UInt8能夠表示256cases楚午,也就意味著如果一個默認枚舉類型且沒有關聯(lián)值的case少于256,當前枚舉類型的大小都是1字節(jié)含长。
indirect 關鍵字的使用
indirect作用就是把后面的BinaryTree分配到堆空間里:這個關鍵字一般用在遞歸里券腔。
Optional可選型
之前我們在寫代碼的過程中早就接觸過可選型,比如我們在代碼這樣定義:
當前的age我們就稱之為可選值茎芋,當然可選值的寫法這兩者是等同的颅眶。
對于Optional的本質是什么?我們直接跳轉到源碼田弥,打開Optional.swift文件涛酗,其就是一個枚舉。
可選鏈
我們都知道在OC中我們給一個nil對象發(fā)送消息什么也不會發(fā)生偷厦,swift中我們是沒有辦法向一個nil對象直接發(fā)送消息商叹,但是借助可選鏈可以達到類似的效果。
可選鏈就是如下只泼,當其無初始值時候也不會報錯
同樣的可選鏈對于下標和函數調用也適用
如下:
??運算符(空合并運算符)
(a ?? b)將對可選類型 a 進行空判斷剖笙,如果a包含一個值就進行解包,否則就返回一個默認值b请唱。
1)表達式 a 必須是 Optional類型
2)默認值 b 的類型必須要和a存儲值的類型保持一致
運算符重載
在源碼中我們可以看到除了重載了 ?? 運算符弥咪,Optional類型還重載了 ==,?=等等運算符十绑,實際開發(fā)中我們可以通過重載運算符簡化我們的表達式聚至,下面是重載定義了---符號。
隱式解析可選類型
隱式解析可選類型是可選類型的一種本橙,使用的過程中和非可選類型無異扳躬。它們之間唯一的區(qū)別是,隱式解析可選類型是你告訴對Swift編譯器甚亭,我在運行時訪問時贷币,值不會為nil。如果為nil的話回閃退亏狰。
var age:Int
var age1: Int R畚啤(這個age1已經隱式解包)
其實日常開發(fā)中我們比較常見這種隱士解析可選類型
IBOutlet類型時Xcode強制為可選類型的,因為它不是在初始化時賦值的骚揍,而是在加載視圖的時候字管。你可以把設置為普通可選類型,但是如果這個視圖加載正確信不,它是不會為空的嘲叔。
與可選值有關的高階函數
1)map:這個方法接受一個閉包,如果可選值有內容則調用這個閉包進行轉換
上面的代碼中我們從字典中取出字符串“1”抽活,并將其轉換為int類型硫戈,但因為String轉換成int不一定成功,所以返回的是int下硕?類型丁逝,而且字典通過鍵不一定能取得到值汁胆,所以map返回的也是一個Optional,所以最后上述代碼result的類型為int??類型霜幼。
那么如何把我們的雙重可選展平開來嫩码,這個時候我們就需要使用到
1)flatMap:可以把結果展平成為單個可選值 (下面用了Int(S0)把其轉換成了int類型)
2)注意,這個方法是作用在Optinal的方法罪既,而不是作用在Sequence上的
3)作用在Sequence上的flatMap方法在Swift4.1中被更名為compactMap铸题。該方法可以將序列中的nil過濾出去。
元類型琢感,AnyClass丢间,Self (self)
1)AnyObject:代表任意類的 instance,類的類型驹针,僅類遵守的協(xié)議烘挫。
2)Any:代表任意類型,包括funcation類型或者 Optional類型
3)AnyClass :代表任意實例的類型