可選連結
你可以使用 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()
。如果 foo
是 nil
,那麼什麼都不會發生 - 程式碼將無聲地失敗並繼續執行。
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
是否為非零)。