可选链接

你可以使用 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 是否为非零)。