可选链(Optional Chaining)
- 如果可选项为nil, 那么调用方法、属性、下标会失败,结果为nil.
- 如果可选项不为nil,那么调用方法、下标、属性成功,结果会包装成可选项。
- 如果结果本来就是可选项,不会进行再次包装。
class Car {
var price = 0
}
class Dog {
var weight = 10
}
class Person {
var name: String = ""
var dog: Dog = Dog()
var car: Car? = Car()
func age() -> Int {
18
}
func eat() {
print("Person eat")
}
subscript(index: Int) -> Int {
index
}
}
var person: Person? = Person()
var age1 = person!.age() // Int,强制解包有风险,一般不用
var age2 = person?.age() // Int?
var name = person?.name // String?
var index = person?[5] // Int?
func getName() -> String {
"jack"
}
person?.name = getName() // 如果person为nil, 那么getName方法不会调用
判断可选项调用方法是否成功,可以使用可选项绑定。
if let _ = person?.eat() {
print("调用成功")
} else {
print("调用失败")
}
多个?可以连在一起,形成可选链。如果链中任意节点为nil, 则整个链会调用失败。
var dog = person?.dog
var weight = person?.dog.weight
var price = person?.car?.price
日常使用:
var score = ["long": [12,33,44], "chi": [55, 66, 77]]
score["long"]?[0] = 23
score["chi"]?[1] = 99
score["xiao"]?[9] = 88
var num1: Int? = 5
num1 = 10 // Option(10)
var num2: Int? = nil
num2? = 10 // nil
print(num2)