Objective-C 和 Swift 之间的 UserDefaults

Ran*_*rns 3 string object objective-c swift userdefaults

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

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

NSString *newString = textField.text;
[[NSUserDefaults standardUserDefaults] setObject: newString forKey:@"textKey"];
Run Code Online (Sandbox Code Playgroud)

当我发布对现在用 Swift 编码的应用程序的更新时,这是否是检查该值是否存在的正确方法:

if (UserDefaults.standard.object(forKey: "textKey") as? String) != nil {
     print("There is a string")
} else {
     print("No string exists") 
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 .string(forKey:) 和 .bool(forKey:) ,因为它们已经被引入了,但是它是最安全的,因为它被保存为一个对象,将其作为一个对象拉出来,然后用“as?细绳”?

同一问题的棘手版本:

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

rma*_*ddy 5

[NS]UserDefaults由 plist 和字典支持。Objective-C 字符串以<string>Some Text</string>.

Swift 中加载的相同 plist 给出了该键的字符串。

UserDefaults.string因此,使用Objective-C 读取存储的值应该没有问题。当然,您仍然需要验证该值是否确实存在。

if let str = UserDefaults.standard.string(forKey: "textKey") {
    print("Found \(str)")
} else {
    print("No string for key")
}
Run Code Online (Sandbox Code Playgroud)

即使原始值不是字符串,使用UserDefault.string也是安全的。它只会返回nil非字符串值。

关于NSDictionaryand NSMutableDictionary,请注意UserDefaults仅检索不可变的NSDictionary。您无法NSMutableDictionary从 读取(或数组)UserDefaults

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