(?.)是Swift 5.1中引入的一个新特性,它可以在可选值上调用属性、方法和下标,并且可以检查它们是否存在,如果存在,就可以获取值,否则可以获取nil。
class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 } let john = Person() // 使用可选链运算符 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."
在上面的例子中,john.residence是可选值,因为它可能是nil,所以我们使用可选链运算符(?.)来检查它是否存在,如果存在,就可以获取它的numberOfRooms属性,否则就会返回nil,从而避免了运行时的异常。
可选链运算符不仅可以访问属性,还可以访问方法和下标,例如:
if let buildingIdentifier = john.residence?.address?.buildingIdentifier() { print("John's building identifier is \(buildingIdentifier).") }
上面的例子中,我们使用可选链运算符调用residence的address属性,调用buildingIdentifier()方法,如果residence和address都存在,就会返回buildingIdentifier的值,否则就会返回nil。
可选链运算符还可以用来访问可选值的下标,例如:
if let firstRoomName = john.residence?[0].name { print("The first room name is \(firstRoomName).") } else { print("Unable to retrieve the first room name.") }
上面的例子中,我们使用可选链运算符访问residence的下标,如果residence存在,就会返回第一个房间的名字,否则就会返回nil。
可选链运算符还可以与nil合并运算符(??)一起使用,以提供默认值,例如:
let roomName = john.residence?[0].name ?? "Unknown" print("The first room name is \(roomName).") // 打印 "The first room name is Unknown."
在上面的例子中,我们使用可选链运算符访问residence的下标,如果residence存在,就会返回第一个房间的名字,否则就会返回“Unknown”作为默认值。
可选链运算符(?.)可以在可选值上调用属性、方法和下标,并且可以检查它们是否存在,如果存在,就可以获取值,否则可以获取nil。它可以帮助我们避免运行时的异常,使代码更加安全和可靠。