let john = Person()
john.residence = Residence()
let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence!.address = johnsAddress
以上示例位于Apple语言指南中。
为什么在最后一行使用强制解包(感叹号)?
此示例中!
和?
之间是否存在差异?
答案 0 :(得分:9)
当知道可选项具有非零值时,使用强制解包。在带有nil值的可选项上使用它会生成运行时异常。
正常的展开取而代之是有条件的。如果john.residence
为nil
,则忽略之后的任何内容,并且不会生成错误(请参阅Optional Chaining)。该陈述根本不做任何事情,因此不会发生任何分配。
强制展开存在的原因是,当它已知有值时,它会避免检查nils。例如,假设您要在控制台上打印String
变量的内容:
let x: String?
print("\(x)")
如果您初始化变量,它会打印出您不可能期望的内容:
let x: String? = "Test"
print("\(x)") // Prints "Optional("Test")"
这是因为x
是Optional
而不是String
类型。
要解决此问题,请使用感叹号强制解包:
print("\(x!)") // Prints "Test"