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
。
关于 NSDictionary
和 NSMutableDictionary
,请注意 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]
只是想在这里格外小心...
如果我有一个应用在 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>
.
在 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
。
关于 NSDictionary
和 NSMutableDictionary
,请注意 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]