Как сохранить словарь словарей в UserDefaults [Int: [Int: Int]]? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь сохранить словарь словарей в 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]' (он же 'Array')

Есть ли способ сохранить [Int: [Int: Int]]] Словарь в UserDefaults?Или я должен использовать другой подход?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Я пытался с 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) }
    }
0 голосов
/ 17 сентября 2018

Вы можете просто использовать JSONEncoder и JSONDecoder для кодирования, поскольку 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]]

Не используйте распаковку при работе с реальными значениями, а не с жестко закодированными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...