ios - XCode Fix-it 建议强制解包 bool 值?

标签 ios swift

我试着这样写:

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/

相关文章:

苹果手机/iPad : I got "a file is encrypted or is not a database" error while using the pragma key in sqlite cipher?

ios - 避免在自定义 UIViewController 容器中加载数百个 View Controller

ios - 在 Xcode 9.2 中看不到 XCUITest 的录制红色按钮

swift - 在 Swift 中将 Firebase 的一个子节点从一个节点更改为另一个节点

swift - Xcode9 是否向后兼容 Swift 3(或 3.1)?

ios - 将 fetchedResultsController 与 swift3 一起使用

ios - Swift - 通过 segue 传递值

ios - 使用 CallKit 切换扬声器和从扬声器切换

xcode - 检查专注于 XCUITest 的 UITextField

objective-c - 对象间共享数据的单例模式