Swift 为什么在本例中使用强制展开?
上面的例子在Apple语言指南中 为什么在最后一行中使用强制展开(感叹号)Swift 为什么在本例中使用强制展开?,swift,optional,Swift,Optional,上面的例子在Apple语言指南中 为什么在最后一行中使用强制展开(感叹号) 之间有区别吗和?在本例中 当知道可选项具有非nil值时,使用强制展开。在具有nil值的可选项上使用它会生成运行时异常 而正常的展开是有条件的。如果john.residence为nil,则忽略它后面的内容,并且不会生成任何错误(请参阅)。语句根本不做任何事情,因此不会发生赋值 强制展开之所以存在,是因为它避免了在已知其值时检查nils。例如,假设您希望将字符串的内容打印到控制台变量: let john = Person()
之间有区别吗代码>和?
在本例中 当知道可选项具有非nil值时,使用强制展开。在具有nil值的可选项上使用它会生成运行时异常
而正常的展开是有条件的。如果john.residence
为nil
,则忽略它后面的内容,并且不会生成任何错误(请参阅)。语句根本不做任何事情,因此不会发生赋值
强制展开之所以存在,是因为它避免了在已知其值时检查nils。例如,假设您希望将字符串的内容打印到控制台
变量:
let john = Person()
john.residence = Residence()
let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence!.address = johnsAddress
如果改为初始化变量,它将打印您可能不希望看到的内容:
let x: String?
print("\(x)")
之所以会出现这种情况,是因为x
是可选的
,而不是字符串
类型。
要解决此问题,请使用感叹号强制展开:
let x: String? = "Test"
print("\(x)") // Prints "Optional("Test")"
最后一次之后再次感谢。在最后一次或两次测试之前,您无法指定可选的链接表达式;要完成同样的事情,需要一系列更复杂的语句。这可能是因为这个例子是在Beta更改之前编写的,在编写它的时候,他们不想进入处理选项的复杂方式。@newact我理解。非常感谢。
print("\(x!)") // Prints "Test"