在这里试着要特别小心......
如果我有一个在Objective-C中保存UserDefaults值的应用程序:
NSString *newString = textField.text;
[[NSUserDefaults standardUserDefaults] setObject: newString forKey:@"textKey"];
当我发布对现在以Swift编码的应用程序的更新时,这是检查此值是否存在的正确方法:
if (UserDefaults.standard.object(forKey: "textKey") as? String) != nil {
print("There is a string")
} else {
print("No string exists")
}
我尝试使用.string(forKey :)和.bool(forKey :),因为它们已被引入,但它是最安全的,因为它被保存为对象以将其作为对象拉出然后测试用"作为?字符串"
同一问题的Trickier版本:
NSDictionary对象的NSMutableArray在UserDefaults中保存为对象
if let oldData = UserDefaults.standard.object(forKey: "theData") as? [NSMutableDictionary] {
}
NSDictionary和NSMutableDictionary在这里可以互换吗?
谢谢!
答案 0 :(得分:4)
[NS]UserDefaults
由plist和字典支持。 Objective-C字符串以<string>Some Text</string>
保存到plist。
在Swift中加载的同一个plist为该键提供了一个字符串。
因此,使用UserDefaults.string
读取Objective-C存储的值时应该没有问题。当然,您仍需要验证实际存在的值。
if let str = UserDefaults.standard.string(forKey: "textKey") {
print("Found \(str)")
} else {
print("No string for key")
}
即使原始值不是字符串,使用UserDefault.string
也是安全的。它只会返回nil
非字符串值。
关于NSDictionary
和NSMutableDictionary
,请注意UserDefaults
仅检索不可变NSDictionary
。您无法从NSMutableDictionary
读取UserDefaults
(或数组)。
请注意,您可以安全地使用Swift词典来阅读原始NSDictionary
。无需使用Objective-C类。
答案 1 :(得分:2)
是的,您的解决方案是安全的,如果您在Objective C代码中保存的值确实是String
类型,那么当您从NSUserDefaults
检索该值时,它将是一个字符串并且将正确被Swift代码的?
运算符强制转换为String。
答案 2 :(得分:0)
推荐的方法(在Swift和Objective-C中)是register每个键值对提供一个默认值。在第一次更改值之前,将考虑此默认值。
let userDefaults = UserDefaults.standard
let defaultValues : [String : Any] = ["textKey" : "", "dictionaryKey" : [:]]
userDefaults.register(defaults: defaultValues)
现在你可以安全地写
if UserDefaults.standard.string(forKey: "textKey")!.isEmpty {
print("No string exists")
} else {
print("There is a string")
}
当然,开发人员负责覆盖相同类型的值。
NSMutableDictionary
与Swift Dictionary
无关。要获取可变对象,只需使用var
关键字。
var dictionary = UserDefaults.standard.object(forKey: "dictionaryKey") as! [String:Any]