Swift文档Chapter 16 可选链


可选链式调用是在当前值可能是nil的情况下请求和调用属性、方法以及下标的方法。

  • 如果可选值有值,那么调用成功;
  • 如果可选值为nil,那么调用返回nil。多个调用连在一起形成调用链,任何一个节点为nil,最终的结果都是nil

使用可选链式调用代替强制展开

在想要调用的属性,方法或下标后加上?就可以定义一个可选链。
为了能够在可选链上返回空值nil,不论这个属性,方法或者下标返回值是不是可选值,返回结果都是可选值。可以对返回值判断是不是nil判断是否调用成功。
可选链返回类型和原类型完全相同,只不过包装成了可选值。

可选链式调用和强制展开的不同

我们定义:

class Person {
    var residence: Residence?
}

class Residence {
    var numberOfRooms = 1
}

其中,residence属性是可选的,如果我们定义了Person类的实例:

let john = Person()

那么residence属性默认是nil.如果我们用!访问的话,会发生错误,因为这个属性为nil不能被强制展开。

let roomCount = john.residence!.numberOfRooms
//会发生错误

我们可以使用?进行访问:

if let roomCount = john.residence?.numberOfRooms {
    print("John's residence has \(roomCount) room(s).")
} else {
    print("Unable to retrieve the number of rooms.")
}
// 打印“Unable to retrieve the number of rooms.”

此时,如果residence不是nil,那么会访问它的属性并返回结果。当然,这个属性也可能会访问失败,那么返回值不再是Int,而是Int?

通过可选链式调用访问属性

如果对于一个可选的属性使用?访问后进行赋值,如果可以访问,那么会进行赋值。如果无法访问,那么等式右端的表达式失效。

通过可选链式调用来调用方法

对于方法来说,即使是一个没有返回值Void的函数,那么返回的结果依然是Void?,依然可以通过条件判断是否为nil

通过可选链式调用访问下标

下标访问时,?应当是放在中括号前面。如果下标不存在,那么也会返回nil.
对于Dictionary类型,我们也可以使用可选链式访问判断一个键值是否存在。

连接多层可选链式调用

可以通过可选链访问更深层的可选链。多层可选链式调用不会增加返回值的可选层级。

  • 如果访问值不可选,可选链式调用会让返回值可选;
  • 如果访问值可选,可选链式调用会让返回值“更可选”。如果返回值是Int?,那么可选链式调用依然是Int?,而不是Int??

在方法的可选返回值上进行可选链式调用

我们还可以在一个可选值上通过可选链式调用来调用方法,并且可以根据需要继续在方法的可选返回值上进行可选链式调用。如果要在该方法的返回值上进行可选链式调用,在方法的圆括号后面加上问号即可。