Swift4.2 Как сохранить двумерный массив, построенный с помощью "struct", в UserDefautls? - PullRequest
0 голосов
/ 08 марта 2019

Я мог бы успешно сохранить массив, состоящий из "struct", которая представляет собой [structData] для userDefautls, используя приведенный ниже код.

    // save [dataCell] encoded to JSON
    func save(_ cellDatas: [cellData]){
        let encoDatas = cellDatas.map{ try? JSONEncoder().encode($0)}
        UserDefaults.standard.set(encoDatas, forKey: "datas")
    }

    // decode JSON array to [cellData]
    func load() -> [cellData]{
        guard let encodedData = UserDefaults.standard.array(forKey: "datas") as? [Data] else {
            return []
        }
        return encodedData.map{try! JSONDecoder().decode(cellData.self, from: $0)}
    }

    // retrieve datas from UD
    func retrieveData() -> [cellData]{
        datas = UserDefaults.standard.array(forKey: "datas") == nil ? initialData : load()
        return datas
    }

Однако теперь, когда мне потребовалось сохранить двумерный массив [[structData]], я попробовал этот код, заменив несколько. Но это не сработало.

//     save [dataCell] encoded to JSON
    func saveTableList(_ tableList: [[cellData]]){
        let encoDatas = tableList.map{ try? JSONEncoder().encode($0)}
        UserDefaults.standard.set(encoDatas, forKey: "tableList")
    }

    // decode JSON array to [cellData]
    func loadTableList() -> [[cellData]]{
        guard let encodedData = UserDefaults.standard.array(forKey: "tableList") as? [[Data]] else {
            return []
        }
        return encodedData.map{try! JSONDecoder().decode(cellData.self, from: $0)}
// this $0 has the error that "Cannot convert value of type '[Data]' to expected argument type 'Data'"
//so I tryied this way instead.
//         return encodedData.map{try! JSONDecoder().decode(cellData.self, from: encodedData)}
//but it didn't work properly
    }

    // retrieve datas from UD
    func retrieveTableListData() -> [cellData]{
        datas = UserDefaults.standard.array(forKey: "datas") == nil ? initialData : load()
        return datas
    }

Как я могу кодировать / декодировать 2d массив, который является [[struct]], в JSON и сохранять / загружать его, используя userDefautls ??

1 Ответ

0 голосов
/ 08 марта 2019

Почему бы вам не кодировать весь двумерный массив сразу, а не создавать массив закодированных объектов. Я попробовал это, и это сработало.

  func saveTableList(_ tableList: [[cellData]]) {
    guard let encodedCellData = try? JSONEncoder().encode(tableList) else {
        print("Error")
        return
    }
    UserDefaults.standard.set(encodedCellData, forKey: "tableList")
}

func loadTableList() -> [[cellData]] {
    guard let encodedCellData = UserDefaults.standard.value(forKey: "tableList") as? Data,
        let cellData = try? JSONDecoder().decode([[cellData]].self, from: encodedCellData) else {
            return []
    }
    return cellData
}
...