同僚に教えてもらったのですが、"!"はImplicitlyUnwrappedOptional
の糖衣構文のようです。
// 下の2つは同じ意味 let a: Int! let a: ImplicitlyUnwrappedOptional<Int>
ImplicitlyUnwrappedOptional
の定義は下のようになっていました。
Optional
とほぼ同じですね。
public enum ImplicitlyUnwrappedOptional<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) /// Construct an instance from an explicitly unwrapped optional /// (`Wrapped?`). public init(_ v: Wrapped?) /// Create an instance initialized with `nil`. public init(nilLiteral: ()) /// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`. @warn_unused_result @rethrows public func map<U>(@noescape f: (Wrapped) throws -> U) rethrows -> U! /// Returns `nil` if `self` is nil, `f(self!)` otherwise. @warn_unused_result @rethrows public func flatMap<U>(@noescape f: (Wrapped) throws -> U!) rethrows -> U! }
ImplicitlyUnwrappedOptional
のNone
とOptional
のNone
を調べたのですが、どちらも同じものとして扱えるようです。
print(Optional.None == nil) // → true print(ImplicitlyUnwrappedOptional.None == nil) // → true print(Optional.None == ImplicitlyUnwrappedOptional.None) // → true