Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么在本例中使用强制展开?_Swift_Optional - Fatal编程技术网

Swift 为什么在本例中使用强制展开?

Swift 为什么在本例中使用强制展开?,swift,optional,Swift,Optional,上面的例子在Apple语言指南中 为什么在最后一行中使用强制展开(感叹号) 之间有区别吗和?在本例中 当知道可选项具有非nil值时,使用强制展开。在具有nil值的可选项上使用它会生成运行时异常 而正常的展开是有条件的。如果john.residence为nil,则忽略它后面的内容,并且不会生成任何错误(请参阅)。语句根本不做任何事情,因此不会发生赋值 强制展开之所以存在,是因为它避免了在已知其值时检查nils。例如,假设您希望将字符串的内容打印到控制台变量: let john = Person()

上面的例子在Apple语言指南中

为什么在最后一行中使用强制展开(感叹号)


之间有区别吗
在本例中

当知道可选项具有非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"