【问题标题】:How to safely unwrap a value from user defaults? [duplicate]如何安全地从用户默认值中解开一个值? [复制]
【发布时间】:2018-06-02 15:56:14
【问题描述】:
if let seen: Bool = defaults.bool(forKey: UtilitiesKeys.mainTutorialSeen) {
    return seen
}
return false

如果我这样做 swift 会显示一个问题:

从 'Bool' 到 'Bool' 的条件转换总是成功,非可选 用于检查可选项的“Bool”类型表达式。

由于我的密钥可能没有值,我不想强​​制解包它。现在显然它是这样工作的,但我如何安全地解开价值而不会迅速抱怨?

我也尝试过使用守卫......

【问题讨论】:

  • 嗯,显示相同的问题,但 d0ye 的答案有效。不过还是谢谢:)

标签: swift optional userdefaults


【解决方案1】:
if let seen = UserDefaults.standard.object(forKey: UtilitiesKeys.mainTutorialSeen)) as? Bool {
        return seen
    }else {
        return false
    }

【讨论】:

  • 请提供一些上下文或解释此代码如何解决问题。这将使它对更多读者更有用。
  • 你能提供保护让吗?
【解决方案2】:

苹果文件说:

/*! -boolForKey: 等价于 -objectForKey:,不同之处在于它将返回值转换为 BOOL。如果该值为 NSNumber,则为 NO 如果值为 0 则返回,否则返回 YES。如果该值为 NSString,“YES”或“1”的值将返回YES,“NO”的值, “0”,或任何其他字符串将返回 NO。如果该值不存在或 无法转换为 BOOL,将返回 NO。

open func bool(forKey defaultName: String) -> Bool

条件绑定的初始化器必须是 Optional 类型,而不是 'Bool'

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    按照文档中的建议:

    -boolForKey: 等价于-objectForKey:,只是它将返回值转换为BOOL。如果值为NSNumber,如果值为0,则返回NO,否则返回YES。如果值为NSString,则"YES""1" 的值将返回YES"NO""0" 或任何其他字符串的值将返回NO。如果该值不存在或无法转换为BOOL,则将返回NO

    open func bool(forKey defaultName: String) -> Bool
    

    它不再是可选的。所以你不需要使用if let 进行投射。

    可以直接使用:

    let seen = defaults.bool(forKey: UtilitiesKeys.mainTutorialSeen)
    

    【讨论】:

    • 啊,谢谢,最好这样做,因为它是最短的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多