21 可选链

什么是可选链,下面看个简单的例子就明白了

/*
 1. 从可选链中进行取值
 2. 给可选链赋值
 3. 可选链调用方法
 */

// 1, 创建3个类
class Person {
    var name: String = ""
    var dog: Dog? // 对象类型的一般是可选类型,值类型一般赋个初值
}
class Dog {
    var weight: Double = 0.0
    var toy: Toy?
}
class Toy {
    var price: Double = 0.0
    func flying() {
        
    }
}

// 2, 创建类的对象
let p = Person()
p.name = "why"
let d = Dog()
d.weight = 60.0
let t = Toy()
t.price = 100.0

p.dog = d
d.toy = t

// 3, 可选链的使用
// 3.1 取出why的狗的玩具的价格
/*
 该写法非常危险:只要没有给对象赋值,强制解包时就会发生运行时错误
 let dog = p.dog
 let toy = dog!.toy
 let price = toy!.price
 */

/*
 // 该写法非常麻烦
if let dog = p.dog {
    if let toy = dog.toy {
        let price = toy.price
    }
}
 */

// 一般用这种写法   ?.  就是可选链
// 系统会自动判断该可选类型是否有值,
// 如果有值,则解包;如果没值,则赋值nil
// 注意:可选链获取的值,一定是一个可选类型
if let price = p.dog?.toy?.price {
    print(price)
}

// 3.2 给why的狗的玩具赋值一个新的价格
// 如果可选链中有一个可选类型没有值,那么语句直接不执行
p.dog?.toy?.price = 50

// 3.3 可选链调用方法
p.dog?.toy?.flying()

你可能感兴趣的:(21 可选链)