美文网首页iOS Developer程序员
读Swift源码:Optional之数据结构与初始化

读Swift源码:Optional之数据结构与初始化

作者: ameerkat | 来源:发表于2017-05-15 12:58 被阅读142次

    先附上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
    }
    

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

    相关文章

      网友评论

        本文标题:读Swift源码:Optional之数据结构与初始化

        本文链接:https://www.haomeiwen.com/subject/aizvzttx.html