先附上Github上Optional源碼地址
本文基于我個人對 Swift 開源源碼的探索呜魄,不保證正確膜毁,可能隨時更新窥浪,有不對的地方望指正镊逝!
拉出 Optional 類型數據結構部分:
enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none // 代表缺少值
case some(Wrapped) // The presence of a value, stored as Wrapped.
}
可以看出 Optional 實際上是一個枚舉類型物臂,遵循了 ExpressibleByNilLiteral 協(xié)議旺拉。
- ExpressibleByNilLiteral 協(xié)議:這個協(xié)議只有一個要求實現(xiàn)的函數,用于用nil初始化實例:
init(nilLiteral: ()) // Creates an instance initialized with nil.
Optional遵守這個協(xié)議的原因接下來就會提到棵磷。
- 兩個枚舉值及其初始化函數:
public init(_ some: Wrapped) { self = .some(some) }
public init(nilLiteral: ()) {
self = .none
}
Optional<Wrapped>.none:代表缺少值蛾狗。可選類型遵循了 ExpressibleByNilLiteral 協(xié)議實現(xiàn)了init(nilLiteral: ())
仪媒,當我們用nil初始化一個實例時沉桌,編譯器會調用該函數將該實例為.none。這就是為什么可選類型可以用nil進行初始化如:
var i: Index? = nil
當我們聲明一個可選值但沒為其賦值時算吩,編譯器也會自動將其置為nil留凭。
Optional<Wrapped>.some:代表有被包裹的值≠顺玻可以看到 .some 枚舉值擁有一個類型為 Wrapped 的關聯(lián)值蔼夜,被包裹的值就存在這里。那么 Wrapped 是什么呢压昼,根據我在這里找到的疑似 Wrapped 的聲明來看求冷,Wrapped 實際上是一個協(xié)議,getValue
確保了協(xié)議遵守者可以獲取到實際存儲的值窍霞,實現(xiàn)尚不明
public protocol Wrapped {
associatedtype Value : Equatable
//var value : Value
func getValue() -> Value
}
下一篇打算看一下運算符的實現(xiàn)