如何安全地从用户默认值中解包值? [重复]

问题描述 投票:1回答:3
if let seen: Bool = defaults.bool(forKey: UtilitiesKeys.mainTutorialSeen) {
    return seen
}
return false

如果我这样做,迅捷向我展示了一个问题:

从'Bool'到'Bool'的条件强制转换总是成功的,在检查选项时使用的'Bool'类型的非可选表达式。

由于我的密钥可能没有值,我不想强​​行打开它。现在很明显它的工作方式是这样的,但是如何在没有迅速抱怨的情况下安全地展开价值呢?

我也试过用卫兵......

swift optional userdefaults
3个回答
0
投票

正如doc中所建议的:

-boolForKey:相当于-objectForKey:,除了它将返回值转换为BOOL。如果该值为NSNumber,则如果值为NO,则返回0,否则返回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)

1
投票
if let seen = UserDefaults.standard.object(forKey: UtilitiesKeys.mainTutorialSeen)) as? Bool {
        return seen
    }else {
        return false
    }

1
投票

Apple文件说:

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

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

条件绑定的初始化程序必须具有可选类型,而不是'Bool'

希望这能帮助你。

© www.soinside.com 2019 - 2024. All rights reserved.