0

我有下面的代码,它工作正常,但我预计该行print(john.residence!.numberOfRooms)会崩溃,因为我的numberOfRooms变量具有nil值,并且在将其值作为参数传递给print(). 谁能解释一下为什么这不会触发运行时错误并nil安全打印?

class Person {
    var residence: Residence?
}

class Residence {
    var numberOfRooms: Int?
}

let john = Person()

john.residence = Residence()

print(john.residence!.numberOfRooms)
4

2 回答 2

2

您正在做的事情称为Optional Chaining。可选链接和强制展开都做同样的事情,但是:

主要区别在于,当可选项为 nil 时,可选项链接会优雅地失败,而当可选项为 nil 时,强制解包会触发运行时错误。

“Swift 编程语言 (Swift 2.2)。” 电子书。https://itun.es/br/jEUH0.l

你强制解开.residence属性,它不是nil:它包含一个Residence实例,它的.numberOfRooms属性设置为nil因为它没有被初始化。由于您没有强制打开它,因此由于可选链接,不会给出错误。尝试强制展开.numberOfRooms属性以获取错误:

print(john.residence!.numberOfRooms!)

或者,您可以删除以下行以设置.residencenil

john.residence = Residence()

这种方式john没有.residence,所以试图强制解包会使 Swift 编译器抛出运行时错误。

于 2016-05-24T07:03:03.300 回答
0

您的应用程序不会崩溃,因为您已经定义了属性numberOfRooms . 这意味着它也将允许空值。

使用而不是. 它肯定会在这个声明上崩溃。

 print(john.residence!.numberOfRooms)

访问此链接将帮助您了解 ? 和 !。
之间的区别?和 !在 Swift 语言中?

于 2016-05-24T07:20:08.397 回答