Objective-C和Swift之间的UserDefaults

时间:2017-05-25 02:50:24

标签: objective-c swift string object userdefaults

在这里试着要特别小心......

如果我有一个在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在这里可以互换吗?

谢谢!

3 个答案:

答案 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非字符串值。

关于NSDictionaryNSMutableDictionary,请注意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]