当调用对象实例的一个函数时,该对象可能不存在(可选类型),看起来你总是可以在对象名后面放一个问号,而不是在对象名后面放一个感叹号,并且没有崩溃。
window!.rootViewController = containerViewController // forced unwrapping
// Can change to question mark and not crash.
window?.rootViewController = containerViewController // Optional chaining
是否在强制展开的使用位置,您可以随时更改为使用可选链接,结果是否相同?如果是,那有什么区别?
答案 0 :(得分:1)
不同之处在于,通过使用?
,您可以在窗口为零时有时执行,有时甚至在窗口为零时执行。换句话说,拥有一个window
是一个有效的期望。
即,window?
表示窗口可能是也可能不是。这意味着.rootViewController = containerViewController
可能无法执行,因为窗口为零。
如果window
为nil
,则会执行并且不会导致应用崩溃。
然而,使用!
会告诉您的应用程序始终将window
视为nil
。如果window
不是nil
,则语句将正确执行,但如果是nil
,则应用会崩溃,因为您明确声明您从未 EXPECT 强>它是零。
总而言之,使用:
window!.rootViewController = containerViewController
当您始终希望窗口有效时,为了设置rootViewController
并使用:
window?.rootViewController = containerViewController
当您担心窗口的状态以及是否应该根据该状态执行语句时。