我在AppDelegate中有一个名为inScreenshotmode
的变量:
#if DEBUG
var inScreenshotMode: Bool {
return UserDefaults.standard.bool(forKey: "abc")
}
#else // Release
let inScreenshotMode = false
#endif
那么如何优化以下代码?
let totalValue = appDelegate?.inScreenshotMode == true ? basicInfo.value : configuration.value
如果我这样做
let totalValue = appDelegate?.inScreenshotMode ? basicInfo.value : configuration.value
我收到错误:
可选类型'Bool?'的值没有打开;你的意思是用'!'要么 '?'?用'替换'appDelegate?.inScreenshotMode' '(的appDelegate?.inScreenshotMode)!'
什么是最佳解决方案?
答案 0 :(得分:2)
根据您对appDelegate
的声明,您似乎将其声明为可选(不知道是什么原因),您面临的是什么称为 Optional Chaining :
可选链接是查询和调用属性的过程, 方法,以及当前可能为nil的可选项的下标。如果 optional包含值,属性,方法或下标调用 成功;如果optional是nil,属性,方法或下标 呼叫返回零。多个查询可以链接在一起,并且 如果链中的任何链接为零,则整个链优雅地失败。
这意味着您必须确保appDelegate
不是nil
而不是(appDelegate?.inScreenshotMode)!
,我建议您执行可选绑定:
if let unwrappedAppDelegate = appDelegate {
let totalValue = unwrappedAppDelegate.inScreenshotMode ? basicInfo.value : configuration.value
}
答案 1 :(得分:1)
问题是appDelegate?.inScreenshotMode
确实是可选的,这意味着它可以返回nil
。由于nil
Equatable ,因此appDelegate?.inScreenshotMode == true
部分将始终返回true
或false
。但使用appDelegate?.inScreenshotMode
可以返回true
,false
或nil
。