iOS Developer程序员

读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 协议。

  1. ExpressibleByNilLiteral 协议:这个协议只有一个要求实现的函数,用于用nil初始化实例:
init(nilLiteral: ())    // Creates an instance initialized with nil.

Optional遵守这个协议的原因接下来就会提到。

  1. 两个枚举值及其初始化函数:
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
}

下一篇打算看一下运算符的实现

上一篇下一篇

猜你喜欢

热点阅读