Swift 4
在基本类型中,UserDefaults
可以保存符合 Codable
协议的任何对象。其中,Dictionary
是实现了该协议的类型之一。你甚至不需要编写任何自定义代码:
let dictionary = ["name": "Adam"]
UserDefaults.standard.set(dictionary, forKey: "names")
let saved = UserDefaults.standard.value(forKey: "names") as? [String: String]
了解更多有关Codable的信息。
Swift 3
只要键和值的类型可以用 plist 格式(NSNumber
、Data
等)表示,就可以使用 UserDefaults
保存 Dictionary
。如果不是这种情况,我们可以在写入时将其他类型序列化为 Data
,在读取时从 Data
反序列化。可以通过对 UserDefaults
进行简单的扩展并使用 NSKeyArchiver
来完成:
extension UserDefaults {
open func set<Key, Value>(dictionary: [Key: Value]?, forKey key: String) {
let data = NSKeyedArchiver.archivedData(withRootObject: dictionary as Any)
set(data, forKey: key)
}
open func dictionary<Key, Value>(forKey key: String) -> [Key: Value]? {
guard let data = object(forKey: key) as? Data else { return nil }
return NSKeyedUnarchiver.unarchiveObject(with: data) as? [Key: Value]
}
}
现在您可以调用这些方法:
let ages = ["Adam": 25]
UserDefaults.standard.set(dictionary: ages, forKey: "ages")
let saved: [String: Int]? = UserDefaults.standard.dictionary(forKey: "ages")
print(saved)
Swift 2
保存自定义数据
func setCustomDictionary(dict: [Int: Bool]) {
let keyedArch = NSKeyedArchiver.archivedDataWithRootObject(dict)
NSUserDefaults.standardUserDefaults().setObject(keyedArch, forKey: "dictionary")
}
获取数据
func getDictionary() -> [Int: Bool]? {
let data = NSUserDefaults.standardUserDefaults().objectForKey("dict")
let object = NSKeyedUnarchiver.unarchiveObjectWithData(data as! NSData)
return object as? [Int: Bool]
}
使用方法
var customDictionary = [Int: Bool]()
customDictionary[2] = true
customDictionary[3] = false
// Store data in NSUserDefaults
setCustomDictionary(customDictionary)
// Get data from NSUserDefaults
let userDefaultsDictionary = getDictionary()
NSUserDefaults.standardUserDefaults().synchronize()
- Dejan Skledarlet
声明的字典中添加值... - Tim Vermeulenlet data = NSKeyedArchiver.archivedDataWithRootObject(self.dictionary)
self.defaults.setObject(data, forKey:"key")
但是在加载时无法理解该怎么做.. :/ - sentylet
声明的字典。除非你提供的代码在同一作用域内,否则self.dictionary
将无法访问刚刚声明的字典。 - Tim Vermeulen