Objective-C 和 Swift 之间的 UserDefaults

UserDefaults between Objective-C and Swift

只是想在这里格外小心...

如果我有一个应用在 UserDefaults 中保存了一个值,就像 Objective-C 中这样:

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:),因为它们已经被引入,但是它是最安全的,因为它被保存为一个对象,将它作为一个对象拉出来,然后进行测试它与 "as? String"?

同一个问题的棘手版本:

NSDictionary 对象的 NSMutableArray 被保存为 UserDefaults 中的对象

if let oldData = UserDefaults.standard.object(forKey: "theData") as? [NSMutableDictionary] {

}

NSDictionary 和 NSMutableDictionary 在这里可以互换吗?

谢谢!

是的,您的解决方案是安全的,如果您在 Objective C 代码中保存的值确实是 String 类型,那么当您从 NSUserDefaults 中检索该值时,它将是一个字符串,并且会被 Swift 代码的 ? 运算符正确地强制转换为一个字符串。

[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 也是安全的。对于非字符串值,它将简单地 return nil

关于 NSDictionaryNSMutableDictionary,请注意 UserDefaults 仅检索不可变的 NSDictionary。您无法从 UserDefaults.

读取 NSMutableDictionary(或数组)

请注意,您可以安全地使用 Swift 字典来阅读原文 NSDictionary。无需使用 Objective-C 类.

推荐的方式(在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]