読者です 読者をやめる 読者になる 読者になる

しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swiftの型宣言に付いている"!"の正体

同僚に教えてもらったのですが、"!"は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!
}

ImplicitlyUnwrappedOptionalNoneOptionalNoneを調べたのですが、どちらも同じものとして扱えるようです。

print(Optional.None == nil) // → true
print(ImplicitlyUnwrappedOptional.None == nil) // → true
print(Optional.None == ImplicitlyUnwrappedOptional.None) // → true