可选链式调用
可选链式调用可以应用于任意类型,并且能检查调用是否成功。
使用可选链式调用代替强制展开
可选链式调用的返回结果与原本的返回结果具有相同的类型,但是被包装成了一个可选值。(类似于:Int?)
//使用可选链式调用代替强制展开
class Person {
var residence: Residence? //如果使用!,residence没有值会出现运行错误
}
class Residence {
var numberOfRooms = 1
}
let john = Person()
为可选链式调用定义模型类
通过使用可选链式调用可以调用多层属性、方法和下标。这样可以在复杂的模型中向下访问各种子属性,并且判断能否访问子属性的属性、方法和下标。
class Person {
var residence: Residence? //如果使用!,residence没有值会出现运行错误
}
class Residence {
var rooms = [Room]()
var numberOfRooms : Int{
return rooms.count
}
subscript(i: Int) -> Room {
get {
return rooms[i]
}
set {
rooms[i] = newValue
}
}
func printNumberOfRooms() {
print("The number of rooms is \(numberOfRooms)")
}
var address: Address?
}
class Room {
let name: String
init(name: String) {
self.name = name
}
}
class Address {
var buildingName:String?
var buildingNumber: String?
var street: String?
func buildingIdentifier() -> String? {
if buildingName != nil {
return buildingName
} else if let buildingNumber = buildingNumber, let street = street{
return "\(buildingNumber) \(street)"
} else {
return nil
}
}
}
通过可选链式调用访问属性
func createAddress() -> Address {
print("Function was called.")
let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
return someAddress
}
john.residence?.address = createAddress()
说明:没有任何打印消息,可以看出 createAddress() 函数并未被执行
通过可选链式来调用方法
if john.residence?.printNumberOfRooms() != nil {
print("It was possible to print the number of rooms.")
} else {
print("It was not possible to print the number of rooms.")
}
可以使用 if 语句来判断能否成功调用 printNumberOfRooms() 方法,即使方法本身没有定义返回值。通过判断返回值是否为 nil 可以判断调用是否成功。
通过可选链式调用访问下标
注:通过可选链式调用访问可选值的下标时,应该将问号放在下标方括号的前面而不是后面。可选链式调用的问号一般直接跟在可选表达式的后面。
if let firstRoomName = john.residence?[0].name {
print("The first room name is \(firstRoomName).")
} else {
print("Unable to retrieve the first room name.")
}
访问可选类型的下标
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Bev"]?[0] += 1 //[80,94,81]
print(testScores)
连接多层可选链式调用
如果访问的值不是可选的,可选链式调用将会返回可选值.(通过可选链式调用访问一个 Int 值,将会返回 Int?,无论使用了多少层可选链式调用)
如果访问的值就是可选的,可选链式调用不会让可选返回值变得“更可选”(类似的,通过可选链式调用访问 Int? 值,依旧会返回 Int? 值,并不会返回 Int??)
在方法的可选返回值上进行可选链式调用
在一个可选值上通过可选链式调用来调用方法,并且可以根据需要继续在方法的可选返回值上进行可选链式调用。