1

调用对象实例的函数时,对象可能不存在(可选类型),似乎可以在对象名后面加一个问号,而不是在对象名后面加一个感叹号,不会崩溃。

window!.rootViewController = containerViewController // forced unwrapping

// Can change to question mark and not crash. 
window?.rootViewController = containerViewController // Optional chaining

是不是在使用强制展开的地方,你总是可以改为使用可选链接,结果是一样的?如果是,有什么区别?

4

1 回答 1

1

不同之处在于,通过使用?您表示您希望它有时在 window 为 nil 时执行,有时在它不是时执行。换句话说,有一个 nilwindow是一个有效的期望。

即,window?表示窗口可能为零,也可能不为零。这意味着.rootViewController = containerViewController可能无法执行,因为 window 为 nil。

window如果是,这将执行并且不会使您的应用程序崩溃nil

然而,使用!告诉你的应用程序总是把window它当作不是nil。如果windowis not nil,该语句将正确执行,但如果它是nil应用程序将崩溃,因为您明确声明您永远不会期望它为 nil。

最后,使用:

window!.rootViewController = containerViewController

当您总是希望窗口有效以设置您的rootViewController

并使用:

window?.rootViewController = containerViewController

当您关心窗口的状态以及是否应根据该状态执行语句时。

于 2015-05-19T11:10:58.903 回答