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