保存并加载自定义词典 - NSUserDefaults

sen*_*nty 4 dictionary nsuserdefaults ios swift

我有一[Int:Bool]本字典,我正在尝试将其保存到我的NSDictionary中.但是,它会因错误而崩溃Attempt to set a non-property-list object

let dictionary = [Int:Bool]()


self.dictionary[2] = true
self.dictionary[3] = false

NSUserDefaults.standardUserDefaults().setObject(dictionary, forKey: "dictionary")
Run Code Online (Sandbox Code Playgroud)

另外,对于加载,首先我尝试了这个但是错误记录它严格要求AnyObject?.

NSUserDefaults.standardUserDefaults().objectForKey("dictionary")
Run Code Online (Sandbox Code Playgroud)

然后我尝试了这个并且记录了:

NSUserDefaults.standardUserDefaults().objectForKey("dictionary") as? [Int:Bool]
Run Code Online (Sandbox Code Playgroud)

我也试过了dictionaryForKey.我有..

NSUserDefaults.standardUserDefaults().dictionaryForKey("dictionary")
Run Code Online (Sandbox Code Playgroud)

无法为类型[String:AnyObject]指定值以键入[Int:Bool]


那么这两个中哪一个更好的方法呢?(我认为这些值在我的情况下是可选的)

1.
NSUserDefaults.standardUserDefaults().objectForKey("dictionary") as? [Int:Bool] ?? [Int:Bool]()

2.
NSUserDefaults.standardUserDefaults().objectForKey("dictionary") as? [Int:Bool])!
Run Code Online (Sandbox Code Playgroud)

Sai*_*ira 11

斯威夫特4

在基本类型中,UserDefaults可以保存符合Codable协议的任何对象.Dictionary是实现此协议的类型之一.您甚至不需要编写任何自定义代码:

let dictionary = ["name": "Adam"]

// Save to User Defaults
UserDefaults.standard.set(dictionary, forKey: "names") 

// Read from User Defaults     
let saved = UserDefaults.standard.value(forKey: "names") as? [String: String]
Run Code Online (Sandbox Code Playgroud)

查看有关Codable的更多信息

斯威夫特3

您可以使用UserDefaults保存Dictionary只要键和值类型是可以在一个的plist格式(代表类型NSNumber,Data等等).如果情况并非如此,我们总是可以Data在编写时将其他类型序列化,并Data在阅读时进行反序列化.它可以用很简单的扩展来完成UserDefaults使用NSKeyArchiver:

extension UserDefaults {
    /// Save dictionary on key
    open func set<Key, Value>(dictionary: [Key: Value]?, forKey key: String) {
        let data = NSKeyedArchiver.archivedData(withRootObject: dictionary as Any)
        set(data, forKey: key)
    }

    // Retrieve dictionary for 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]
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以调用这些方法:

let ages = ["Adam": 25]

// Save
UserDefaults.standard.set(dictionary: ages, forKey: "ages")

// Read
let saved: [String: Int]? = UserDefaults.standard.dictionary(forKey: "ages")
print(saved) // Optional(["Adam": 25])
Run Code Online (Sandbox Code Playgroud)

斯威夫特2

保存自定义数据

func setCustomDictionary(dict: [Int: Bool]) {
    let keyedArch = NSKeyedArchiver.archivedDataWithRootObject(dict)

    NSUserDefaults.standardUserDefaults().setObject(keyedArch, forKey: "dictionary")
}
Run Code Online (Sandbox Code Playgroud)

检索数据

func getDictionary() -> [Int: Bool]? {
    let data = NSUserDefaults.standardUserDefaults().objectForKey("dict")
    let object = NSKeyedUnarchiver.unarchiveObjectWithData(data as! NSData)
    return object as? [Int: Bool]
}
Run Code Online (Sandbox Code Playgroud)

用法

var customDictionary = [Int: Bool]()
customDictionary[2] = true
customDictionary[3] = false

// Store data in NSUserDefaults
setCustomDictionary(customDictionary)

// Get data from NSUserDefaults
let userDefaultsDictionary = getDictionary()
Run Code Online (Sandbox Code Playgroud)