为什么在这个例子中使用force unwrapping?

时间:2014-08-28 14:03:52

标签: swift optional

let john = Person()
john.residence = Residence()

let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"

john.residence!.address = johnsAddress

以上示例位于Apple语言指南中。

为什么在最后一行使用强制解包(感叹号)?

此示例中!?之间是否存在差异?

1 个答案:

答案 0 :(得分:9)

当知道可选项具有非零值时,使用强制解包。在带有nil值的可选项上使用它会生成运行时异常。

正常的展开取而代之是有条件的。如果john.residencenil,则忽略之后的任何内容,并且不会生成错误(请参阅Optional Chaining)。该陈述根本不做任何事情,因此不会发生任何分配。

强制展开存在的原因是,当它已知有值时,它会避免检查nils。例如,假设您要在控制台上打印String变量的内容:

let x: String?
print("\(x)")

如果您初始化变量,它会打印出您不可能期望的内容:

let x: String? = "Test"
print("\(x)") // Prints "Optional("Test")"

这是因为xOptional而不是String类型。 要解决此问题,请使用感叹号强制解包:

print("\(x!)") // Prints "Test"