读Swift源码:Optional之数据结构与初始化
2017-05-15 本文已影响142人
ameerkat
先附上Github上Optional源码地址
本文基于我个人对 Swift 开源源码的探索,不保证正确,可能随时更新,有不对的地方望指正!
拉出 Optional 类型数据结构部分:
enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none // 代表缺少值
case some(Wrapped) // The presence of a value, stored as Wrapped.
}
可以看出 Optional 实际上是一个枚举类型,遵循了 ExpressibleByNilLiteral 协议。
- ExpressibleByNilLiteral 协议:这个协议只有一个要求实现的函数,用于用nil初始化实例:
init(nilLiteral: ()) // Creates an instance initialized with nil.
Optional遵守这个协议的原因接下来就会提到。
- 两个枚举值及其初始化函数:
public init(_ some: Wrapped) { self = .some(some) }
public init(nilLiteral: ()) {
self = .none
}
Optional<Wrapped>.none:代表缺少值。可选类型遵循了 ExpressibleByNilLiteral 协议实现了init(nilLiteral: ())
,当我们用nil初始化一个实例时,编译器会调用该函数将该实例为.none。这就是为什么可选类型可以用nil进行初始化如:
var i: Index? = nil
当我们声明一个可选值但没为其赋值时,编译器也会自动将其置为nil。
Optional<Wrapped>.some:代表有被包裹的值。可以看到 .some 枚举值拥有一个类型为 Wrapped 的关联值,被包裹的值就存在这里。那么 Wrapped 是什么呢,根据我在这里找到的疑似 Wrapped 的声明来看,Wrapped 实际上是一个协议,getValue
确保了协议遵守者可以获取到实际存储的值,实现尚不明
public protocol Wrapped {
associatedtype Value : Equatable
//var value : Value
func getValue() -> Value
}
下一篇打算看一下运算符的实现