swift - 如何在不使用临时变量的情况下在 NSUserDefaults 中写入字典条目?

标签 swift dictionary nsuserdefaults

我有这个代码:

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"]

关于swift - 如何在不使用临时变量的情况下在 NSUserDefaults 中写入字典条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39222646/

相关文章:

ios - 字符串的长度作为字符串的扩展

c++ - 如何在不移动的情况下交换 map 元素?

python - 按键组合两个大型词典的最快方法是什么?

xcode - 以编程方式清除所有应用程序数据(特别是 NSUserDefaults)

Swift:for 循环、搜索字典、从键设置变量

arrays - Swift 3 - 如何从包含字符串的索引读取 json 输出

ios - self.variable 和 _variable 的区别,关于 KVO

c++ - 为什么使用集合而不是 map ? C++

objective-c - 使用 NSUserDefaults 存储 NSMutableArray

crash - 从[[[NSUserDefaults standardUserDefaults] persistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]] objectForKey:@“AppleLocale”] [0]崩溃;