我试着这样写:
cardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden()
但是 XCode 7.0 报错:
可选类型 'Bool?' 的值未展开;你是不是想用'!'或“?”?
我点击了建议的修复,它变成了:
cardVC.hideStatusBar = (rootNavController?.prefersStatusBarHidden())!
将语句包裹在括号中并添加 !
究竟有什么作用?我知道这股力量会解开它。如果 rootNavController != nil
,那么那里会有一个 BOOL 值。但是,如果 rootNavController
为 nil,那么我的原始语句 rootNavController?.prefersStatusBarHidden()
是否只返回 0(或 false),这就是我们可以强制展开它的原因,本质上是返回如果为零则为假?
最佳答案
If
rootNavController != nil
, then there will be a BOOL value there
正确。
If rootNavController is nil, then does my original statement
rootNavController?.prefersStatusBarHidden()
just return 0 (or false)
没有。原始语句将返回 nil
。该语句可以理解为“如果 rootNavController
不是 nil
,则返回 rootNavController.prefersStatusBarHidden()
。否则返回 nil
”。
正如评论中所指出的,在解包可选时提供默认值的快捷方式是通过 nil coalescing operator : cardVC.hideStatusBar = rootNavController?.prefersStatusBarHidden() ??错误
。此语句执行您想象的操作,可以理解为“如果 rootNavController
不是 nil
,则返回 rootNavController.prefersStatusBarHidden()
。否则返回 false ".
强制展开可选项是不同的。 rootNavController?.prefersStatusBarHidden()
返回一个可选值,rootNavController!.prefersStatusBarHidden()
总是返回一个非零值(在本例中为 bool)。用 nil
值强制解包一个可选值会在运行时使你的程序崩溃。
同样,您的强制展开语句可以理解为“如果 rootNavController
不是 nil
,则返回 rootNavController.prefersStatusBarHidden()
。否则崩溃”。
在我对 this question 的回答中我对可选值和强制展开做了一个简短的解释,你可能想看看。
关于ios - XCode Fix-it 建议强制解包 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33131185/