2014-08-28 49 views
3
let john = Person() 
john.residence = Residence() 

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

john.residence!.address = johnsAddress 

以上示例位于Apple语言指南中。为什么在这个例子中使用强制展开?

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

在这个例子中,!?之间有区别吗?

+0

最后测试或两个之前,你不能分配给一个可选的链接表达;要完成同样的事情需要一系列更复杂的陈述。这可能是因为这个例子是在beta版本改变之前编写的,当时他们写了这个例子,他们不想采用复杂的处理optionals的方式。 – newacct 2014-08-28 18:20:58

+0

@newacct我明白了。谢谢。 – jjaeko 2014-08-29 11:23:57

回答

9

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

正常的解包是有条件的。如果john.residencenil,则忽略之后的任何内容都不会生成错误(请参阅Optional Chaining)。声明根本没有做任何事情,因此没有任何分配。

强制解包存在的原因是它避免了在知道nils有值时检查nils。例如,让我们假设你想打印到控制台String变量的内容:

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

如果初始化变量,而不是,它会打印的东西,你就不会可能会期待:

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

发生这种情况是因为xOptional而不是String类型。 为了解决这个问题,将强制使用感叹号展开:

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

最后一次再次感谢。 – jjaeko 2014-08-28 14:44:26

相关问题