更改为使用可选链接替换强制解包在swift中有什么区别?

时间:2015-05-19 10:58:06

标签: swift forced-unwrapping optional-chaining

当调用对象实例的一个函数时,该对象可能不存在(可选类型),看起来你总是可以在对象名后面放一个问号,而不是在对象名后面放一个感叹号,并且没有崩溃。

window!.rootViewController = containerViewController // forced unwrapping

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

是否在强制展开的使用位置,您可以随时更改为使用可选链接,结果是否相同?如果是,那有什么区别?

1 个答案:

答案 0 :(得分:1)

不同之处在于,通过使用?,您可以在窗口为零时有时执行,有时甚至在窗口为零时执行。换句话说,拥有一个window是一个有效的期望。

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

如果windownil,则会执行并且不会导致应用崩溃。

然而,使用!会告诉您的应用程序始终将window视为nil。如果window不是nil,则语句将正确执行,但如果是nil,则应用会崩溃,因为您明确声明您从未 EXPECT 它是零。

总而言之,使用:

window!.rootViewController = containerViewController

当您始终希望窗口有效时,为了设置rootViewController

并使用:

window?.rootViewController = containerViewController

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