我试着写这个:
cardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden()
但是XCode 7.0抱怨错误:
Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?
我点击了建议的修补程序,它变成了:
cardVC.hideStatusBar = (rootNavController?.prefersStatusBarHidden())!
在括号中包装语句并添加!
到底做了什么?我知道这支部队打开了它。如果rootNavController != nil
,则那里会有一个BOOL值。但是,如果rootNavController
为nil,那么我的原始语句rootNavController?.prefersStatusBarHidden()
是否只返回0(或错误),这就是为什么我们可以强制解包它,如果为零则基本上返回false?
答案 0 :(得分:2)
如果
rootNavController != nil
,则会有一个BOOL值
正确。
如果rootNavController为nil,那么我的原始语句
rootNavController?.prefersStatusBarHidden()
只返回0(或错误)
没有。原始语句将返回nil
。该声明可以理解为“如果rootNavController
不是nil
,则返回rootNavController.prefersStatusBarHidden()
。否则返回nil
”。
正如评论中所指出的,在展开可选项时提供默认值的快捷方式是nil coalescing operator:cardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden() ?? false
。此语句执行您的想象,并且可以读作“如果rootNavController
不是nil
,则返回rootNavController.prefersStatusBarHidden()
。否则返回false”。
强制展开可选项是不同的。当rootNavController?.prefersStatusBarHidden()
返回一个可选项时,rootNavController!.prefersStatusBarHidden()
始终返回一个非零值(在本例中为bool)。强制解包带有nil
值的可选项将在运行时使程序崩溃。
同样,您的强制解包声明可以理解为“如果rootNavController
不是nil
,则返回rootNavController.prefersStatusBarHidden()
。否则崩溃”。
在我对this question的回答中,我简要解释了关于选项和强制解包的问题,你可能想看看。