这个问题在这里已有答案:
if let seen: Bool = defaults.bool(forKey: UtilitiesKeys.mainTutorialSeen) {
return seen
}
return false
如果我这样做,迅捷向我展示了一个问题:
从'Bool'到'Bool'的条件强制转换总是成功的,在检查选项时使用的'Bool'类型的非可选表达式。
由于我的密钥可能没有值,我不想强行打开它。现在很明显它的工作方式是这样的,但是如何在没有迅速抱怨的情况下安全地展开价值呢?
我也试过用卫兵......
正如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)
if let seen = UserDefaults.standard.object(forKey: UtilitiesKeys.mainTutorialSeen)) as? Bool {
return seen
}else {
return false
}
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'
希望这能帮助你。