如何在不使用临时变量的情况下在 NSUserDefaults 中写入字典条目?
How to write inside a dictionary entry in NSUserDefaults without using temporary variables?
我有这个代码:
var address = Dictionary<String, AnyObject?>();
address["address1"] = "Here";
address["address2"] = "There";
...
let defaults = NSUserDefaults.standardUserDefaults();
var data = defaults.valueForKey("active_user")! as! Dictionary<String, AnyObject?>
data["address"] = address;
defaults.setValue(data, forKey: "active_user");
defaults.synchronize();
我想改成这样:
var address = Dictionary<String, AnyObject?>();
address["address1"] = "Here";
address["address2"] = "There";
...
let defaults = NSUserDefaults.standardUserDefaults();
defaults["active_user"]!["address"]! = address;
defaults.synchronize();
这可能吗?我该怎么做?
这在一定程度上可以通过扩展 NSUserDefaults 使其具有下标来实现。见下文:
extension NSUserDefaults {
subscript(key: String) -> Any {
get {
return value(forKey: key)
}
set {
setValue(newValue, forKey: key)
}
}
}
然后可以这样使用:
let defaults = NSUserDefaults.standardUserDefaults()
defaults["myKey"] = "someValue"
let myValue = defaults["myKey"]
一个限制是您将无法像您在示例中所做的那样修改嵌套集合。您总是必须手动分配回用户默认对象才能保存一些东西。
// this won't work
defaults["active_user"]!["address"]! = address;
// do this instead
let user = defaults["active_user"]!
user["address"] = address
defaults["active_user"] = user
编辑:
我找到了一种重载下标的方法,因此您可以修改嵌套集合,语法略有不同但非常简洁。只适用于一层嵌套,但我认为它可以更进一步。将此添加到您的 NSUserDefaults
分机:
subscript(firstKey: String, secondKey: String) -> Any? {
get {
if let dict = value(forKey: firstKey) as? [String: Any] {
return dict[secondKey]
}
return nil
}
set {
if let dict = value(forKey: firstKey) as? [String: Any] {
dict[secondKey] = newValue
setValue(dict, forKey: firstKey)
}
}
}
那么你可以这样做:
defaults["active_user", "address"] = "some address"
let address = defaults["active_user", "address"]
我有这个代码:
var address = Dictionary<String, AnyObject?>();
address["address1"] = "Here";
address["address2"] = "There";
...
let defaults = NSUserDefaults.standardUserDefaults();
var data = defaults.valueForKey("active_user")! as! Dictionary<String, AnyObject?>
data["address"] = address;
defaults.setValue(data, forKey: "active_user");
defaults.synchronize();
我想改成这样:
var address = Dictionary<String, AnyObject?>();
address["address1"] = "Here";
address["address2"] = "There";
...
let defaults = NSUserDefaults.standardUserDefaults();
defaults["active_user"]!["address"]! = address;
defaults.synchronize();
这可能吗?我该怎么做?
这在一定程度上可以通过扩展 NSUserDefaults 使其具有下标来实现。见下文:
extension NSUserDefaults {
subscript(key: String) -> Any {
get {
return value(forKey: key)
}
set {
setValue(newValue, forKey: key)
}
}
}
然后可以这样使用:
let defaults = NSUserDefaults.standardUserDefaults()
defaults["myKey"] = "someValue"
let myValue = defaults["myKey"]
一个限制是您将无法像您在示例中所做的那样修改嵌套集合。您总是必须手动分配回用户默认对象才能保存一些东西。
// this won't work
defaults["active_user"]!["address"]! = address;
// do this instead
let user = defaults["active_user"]!
user["address"] = address
defaults["active_user"] = user
编辑:
我找到了一种重载下标的方法,因此您可以修改嵌套集合,语法略有不同但非常简洁。只适用于一层嵌套,但我认为它可以更进一步。将此添加到您的 NSUserDefaults
分机:
subscript(firstKey: String, secondKey: String) -> Any? {
get {
if let dict = value(forKey: firstKey) as? [String: Any] {
return dict[secondKey]
}
return nil
}
set {
if let dict = value(forKey: firstKey) as? [String: Any] {
dict[secondKey] = newValue
setValue(dict, forKey: firstKey)
}
}
}
那么你可以这样做:
defaults["active_user", "address"] = "some address"
let address = defaults["active_user", "address"]