ios - 保存和加载自定义字典 ​​- NSUserDefaults

标签 ios swift dictionary nsuserdefaults

我有一个 [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")

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

NSUserDefaults.standardUserDefaults().objectForKey("dictionary")

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

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

我还尝试了 dictionaryForKey。我得到了..

NSUserDefaults.standardUserDefaults().dictionaryForKey("dictionary")

Cannot assign value to type [String: AnyObject] to type [Int:Bool]


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

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

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

最佳答案

swift 4

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

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]

查看有关 Codable 的更多信息

swift 3

您可以使用 UserDefaults 来保存 Dictionary,只要键和值类型是可以用 plist 格式表示的类型(NSNumber数据等)。如果不是这种情况,我们总是可以在写入时将其他类型序列化为 Data,并在读取时从 Data 反序列化。它可以通过使用 NSKeyArchiverUserDefaults 的非常简单的扩展来完成:

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

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

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

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()

关于ios - 保存和加载自定义字典 ​​- NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36790022/

相关文章:

arrays - 对成员 '+' 的引用不明确

Python:为什么我不能将元组解包到字典中?

python - 我可以使用 configparser 制作字典的字典吗?

iphone - 任何 iOS block 的标识

objective-c - 创建多个 UILocalNotification

swift - 在实例化 View Controller 中使用 NSMutableAttributedString 引用 UIButton 时出现问题

ios - 将 Realm 与 WatchKit 框架一起使用

python - 从字典列表中返回一个特定的字典

ios - 适用于 ios sdk 的易于使用且开源的条码扫描器有哪些?

ios - 导航 Controller 左边缘滑动和后退按钮行为之间的差异