代码之家  ›  专栏  ›  技术社区  ›  j.krissa

代码清理斯威夫特

  •  0
  • j.krissa  · 技术社区  · 7 年前

    我有一个变量名为 inScreenshotmode 在AppDelegate中:

    #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
    

    I获取错误:

    可选类型“Bool”的值未打开包装;你想用“!”吗或“?”?替换“appDelegate”?。inScreenshotMode“带 “(appDelegate?.inScreenshotMode)!”

    最好的解决方案是什么?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ahmad F    7 年前

    根据您的声明 appDelegate 似乎您将其声明为可选(不确定这是什么原因),您所面临的是什么 Optional Chaining :

    可选链接是查询和调用属性的过程, 方法和当前可能为零的可选上的下标。如果 可选的包含值、属性、方法或子脚本调用 成功;如果可选项为nil,则属性、方法或下标 call返回nil。可以将多个查询链接在一起 如果链中的任何链接为零,则整个链将正常失败。

    这意味着你必须确保 appDelegate 不是 nil 而不是 (appDelegate?.inScreenshotMode)! ,我建议进行可选绑定:

    if let unwrappedAppDelegate = appDelegate {
        let totalValue = unwrappedAppDelegate.inScreenshotMode ? basicInfo.value : configuration.value
    }
    
        2
  •  1
  •   Malik    7 年前

    问题是 appDelegate?.inScreenshotMode 确实是可选的,这意味着它可以返回 nil 。自从 均衡的 ,零件 appDelegate?.inScreenshotMode == true 将始终返回 true false 。但使用 appDelegate?。inScreenshotMode屏幕显示模式 可以自行返回 真的 ,则, 错误