239 字
1 分钟
Optional实质
2020-10-13
2026-10-12
无标签

Swift-Optional实质#

底层实现#

我们先看看Swift中Optional是怎么实现的把

public enum Optional<Wrapped> : _Reflectable, NilLiteralConvertible {
case None
case Some(Wrapped)
/// Construct a `nil` instance.
public init()
/// Construct a non-`nil` instance that stores `some`.
public init(_ some: Wrapped)
/// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`.
@warn_unused_result
public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U?
/// Returns `nil` if `self` is `nil`, `f(self!)` otherwise.
@warn_unused_result
public func flatMap<U>(@noescape f: (Wrapped) throws -> U?) rethrows -> U?
/// Create an instance initialized with `nil`.
public init(nilLiteral: ())
}

很明显可以看出,它实际是一个枚举。 .Some的关联值就是我们解包出来的

? & !#

在我们对一个Optional的变量进行赋值的时候,我们实际上是将初始值放到.Some中,取值是则是从.Some中取出。

  • !
    • 强制解包,告诉系统这个变量不为nil 且 .Some中一定有值
    • 如果为空则会崩溃
  • ?
    • 解包时会先判断是否为nil如果不为空则正常解包,否则会返回nil即默认初始值