如何将字典字典保存到 UserDefaults [Int:[Int:Int]]?

Posted

技术标签:

【中文标题】如何将字典字典保存到 UserDefaults [Int:[Int:Int]]?【英文标题】:How to save a Dictionary of Dictionaries to UserDefaults [Int:[Int:Int]]? 【发布时间】:2018-09-17 10:51:05 【问题描述】:

我正在尝试将字典字典保存到 UserDefaults。

我可以这样保存字典:

var dict = [Int:[Int:Int]]()
dict[1] = [4:3]
dict[10] = [5:10]

let data = try 
NSKeyedArchiver.archivedData(withRootObject: dict, requiringSecureCoding: false)
UserDefaults.standard.set(data, forKey: "dict")

但是当我尝试检索它时:

if let data2 = defaults.object(forKey: "dict") as? NSData 
let dict = NSKeyedUnarchiver.unarchivedObject(ofClasses: [Int:[Int:Int]], from: data2)
print(dict)

我收到一个错误:无法将类型“[Int : [Int : Int]].Type”的值转换为预期的参数类型“[AnyClass]”(又名“数组”)

有没有办法在 UserDefaults 中存储 [Int:[Int:Int]] 字典?还是我必须使用其他方法?

【问题讨论】:

【参考方案1】:

您可以简单地使用JSONEncoderJSONDecoder 进行编码,因为Dictionary<Int,Dictionary<Int,Int>> 符合Codable

var dict = [Int:[Int:Int]]()
dict[1] = [4:3]
dict[10] = [5:10]

let encodedDict = try! JSONEncoder().encode(dict)

UserDefaults.standard.set(encodedDict, forKey: "dict")
let decodedDict = try! JSONDecoder().decode([Int:[Int:Int]].self, from: UserDefaults.standard.data(forKey: "dict")!) //[10: [5: 10], 1: [4: 3]]

在使用实数值而不是这些硬编码的数值时,不要使用强制展开。

【讨论】:

最好将数据保存到单独的 json 文件中。将其插入 plist 文件中没有任何意义 @LeoDabus 你是对的,我也不一定将它保存到UserDefaults,但它并没有真正造成任何伤害,OP 正在询问如何保存到UserDefaults。使用PropertyListEncoder 代替JSONEncoder 也适用于保存到UserDefaults【参考方案2】:

我用 swift 4.1 试过了,下面的方法效果很好。

    var dict = [Int:[Int:Int]]()
    dict[1] = [4:3]
    dict[10] = [5:10]

    let data = try NSKeyedArchiver.archivedData(withRootObject: dict)
    UserDefaults.standard.set(data, forKey: "dict")

检索:

    if let data2 = UserDefaults.standard.object(forKey: "dict") as? Data 
        let dict = NSKeyedUnarchiver.unarchiveObject(with: data2)
        if let dic = dict as? [Int:[Int:Int]]  print(dic) 
    

【讨论】:

是的,这行得通,但这些方法在 ios 12 中已弃用:'archivedData(withRootObject:)' 在 iOS 12.0 中已弃用:使用 +archivedDataWithRootObject:requiringSecureCoding:error: 而不是 'unarchiveObject(with:) ' 在 iOS 12.0 中已弃用:改用 +unarchivedObjectOfClass:fromData:error: 如果我使用非弃用方法,我会收到以下错误:无法将类型 '[Int : [Int : Int]].Type' 的值转换为预期的参数类型“[AnyClass]”(又名“Array”) 请注意,您可以使用 UserDefaults data(forKey:) 方法而不是使用 object(forKey:) 并从 Any 转换为 Data

以上是关于如何将字典字典保存到 UserDefaults [Int:[Int:Int]]?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 [String: UIImage] 类型的字典存储到 CoreData/UserDefaults 中?

从 UserDefaults 获得的布尔值打印为 0 或 1,即使保存为 Any

SwiftUI 从 UserDefaults.standard 存储和提取字典

在 UserDefaults 中存储字典

Swift Userdefaults 将 String 转换为 __NSCFString

使用 UserDefaults 保存数组