Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将字典字典保存为UserDefaults[Int:[Int:Int]]?_Ios_Swift_Dictionary - Fatal编程技术网

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

Ios 如何将字典字典保存为UserDefaults[Int:[Int:Int]]?,ios,swift,dictionary,Ios,Swift,Dictionary,我正在尝试将词典保存为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") 但当我试图

我正在尝试将词典保存为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]]”类型的值转换为预期的参数类型“[AnyClass]”(也称为“Array”)


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

您可以简单地使用
jsonecoder
jsondecorder
进行编码,因为
Dictionary
符合
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]]

在处理实值而不是硬编码值时,不要使用强制展开。

您可以简单地使用
jsonecoder
JSONDecoder
进行编码,因为
字典
符合
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]]

在处理实值而不是硬编码值时,不要使用强制展开。

我用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) }
    }

我尝试了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中被弃用:iOS 12.0中弃用了“archivedData(withRootObject:)”:使用+archivedDataWithRootObject:RequiringSecureCodeding:error:而iOS 12.0中弃用了“unarchiveObject(with:)”:使用+unarchivedObjectOfClass:fromData:error:如果我使用了未弃用的方法,我遇到以下错误:无法将“[Int:[Int:Int]]”类型的值转换为预期的参数类型“[AnyClass]”(也称为“Array”),请注意,您可以使用UserDefaults
data(forKey:)
方法,而不是使用object(forKey:)并从Any强制转换为DataYes,这是可行的,但这些方法在iOS 12中不推荐使用:“archivedData(withRootObject:)“”在iOS 12.0中不推荐使用:使用+archivedDataWithRootObject:RequiringSecureCodeding:error:而在iOS 12.0中不推荐使用“unarchiveObject(with:)”:使用+unarchivedObjectOfClass:fromData:error:而如果使用未推荐使用的方法,则会出现以下错误:无法转换“[Int:[Int:Int]”类型的值.Type“to expected argument Type”[AnyClass]”(也称为“Array”)注意,您可以使用UserDefaults
data(forKey:)
方法,而不是使用object(forKey:)和从Any强制转换到DataBetter,以将数据保存到单独的json文件。将其插入plist中没有任何意义file@LeoDabus你说得对,我也不一定把它保存到
UserDefaults
,但它实际上并没有什么害处,OP问如何保存到
UserDefaults
。使用
PropertyListEncoder
而不是
jsonecoder
也可以保存到
UserDefaults
中。最好将数据保存到单独的json文件中。将其插入plist中没有任何意义file@LeoDabus你说得对,我也不一定把它保存到
UserDefaults
,但它实际上并没有什么害处,OP问如何保存到
UserDefaults
。使用
PropertyListEncoder
而不是
jsonecoder
也可以保存到
UserDefaults
中。