3

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

如果我有一个应用程序在 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:) ,因为它们已经被引入,但它是最安全的,因为它被保存为一个对象,将它作为一个对象拉出来,然后用 "as?细绳”?

同一问题的棘手版本:

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

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

}

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

谢谢!

4

3 回答 3

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")
}

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

关于NSDictionaryand NSMutableDictionary,请注意UserDefaults只检索 immutable NSDictionary。您无法从中读取NSMutableDictionary(或数组)UserDefaults

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

于 2017-05-25T02:56:07.357 回答
2

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

于 2017-05-25T02:55:58.353 回答
0

推荐的方法(在 Swift 和 Objective-C 中)是注册每个键值对以提供默认值。在第一次更改该值之前,会一直考虑此默认值。

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]
于 2017-05-25T03:28:48.847 回答