XCode Fix-it建议用力打开一个bool?

时间:2015-10-14 16:49:35

标签: ios swift

我试着写这个:

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?

1 个答案:

答案 0 :(得分:2)

  

如果rootNavController != nil,则会有一个BOOL值

正确。

  

如果rootNavController为nil,那么我的原始语句rootNavController?.prefersStatusBarHidden()只返回0(或错误)

没有。原始语句将返回nil。该声明可以理解为“如果rootNavController不是nil,则返回rootNavController.prefersStatusBarHidden()。否则返回nil”。

正如评论中所指出的,在展开可选项时提供默认值的快捷方式是nil coalescing operatorcardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden() ?? false。此语句执行您的想象,并且可以读作“如果rootNavController不是nil,则返回rootNavController.prefersStatusBarHidden()。否则返回false”。

强制展开可选项是不同的。当rootNavController?.prefersStatusBarHidden()返回一个可选项时,rootNavController!.prefersStatusBarHidden()始终返回一个非零值(在本例中为bool)。强制解包带有nil值的可选项将在运行时使程序崩溃。

同样,您的强制解包声明可以理解为“如果rootNavController不是nil,则返回rootNavController.prefersStatusBarHidden()。否则崩溃”。

在我对this question的回答中,我简要解释了关于选项和强制解包的问题,​​你可能想看看。