可選連結

你可以使用 Optional Chaining 來呼叫方法 ,訪問屬性下標可選。這是通過在給定的可選變數和給定成員(方法,屬性或下標)之間放置 ? 來完成的。

struct Foo {
    func doSomething() {
        print("Hello World!")
    }
}

var foo : Foo? = Foo()

foo?.doSomething() // prints "Hello World!" as foo is non-nil

如果 foo 包含一個值,將在其上呼叫 doSomething()。如果 foonil,那麼什麼都不會發生 - 程式碼將無聲地失敗並繼續執行。

var foo : Foo? = nil

foo?.doSomething() // will not be called as foo is nil

(這與在 Objective-C 中向 nil 傳送訊息的行為類似)

可選連結這樣命名的原因是可選性將通過你呼叫/訪問的成員傳播。這意味著,與可選連結一起使用的任何成員的返回值都是可選的,無論它們是否被輸入為可選項。

struct Foo {
    var bar : Int
    func doSomething() { ... }
}

let foo : Foo? = Foo(bar: 5)
print(foo?.bar) // Optional(5)

這裡 foo?.bar 正在返回 Int?,即使 bar 是非可選的,因為 foo 本身是可選的。

隨著可選性的傳播,返回 Void 的方法將在使用可選連結呼叫時返回 Void?。這可以用於確定方法是否被呼叫(因此可選的具有值)。

let foo : Foo? = Foo()

if foo?.doSomething() != nil {
    print("foo is non-nil, and doSomething() was called")
} else {
    print("foo is nil, therefore doSomething() wasn't called")
}

這裡我們將 Void? 的返回值與 nil 進行比較,以確定方法是否被呼叫(因此 foo 是否為非零)。