代码清理Swift

时间:2018-03-15 09:04:04

标签: swift optional

我在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)!'

什么是最佳解决方案?

2 个答案:

答案 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部分将始终返回truefalse。但使用appDelegate?.inScreenshotMode可以返回truefalsenil