【问题标题】:Swift4.2 How to save a two dimensional array constructed by "struct" to UserDefautls?Swift 4.2 如何将“struct”构造的二维数组保存到UserDefaults?
【发布时间】:2019-03-08 14:13:46
【问题描述】:

通过使用下面的代码,我可以成功地将包含“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
    }

如何将 [[struct]] 的二维数组编码/解码为 JSON 并使用 userDefautls 保存/加载它??

【问题讨论】:

    标签: arrays json swift xcode userdefaults


    【解决方案1】:

    为什么不一次编码整个二维数组而不是创建编码对象数组。我试过了,效果很好。

      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
    }
    

    【讨论】:

    • 感谢您的评论!我会试试你的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2017-12-06
    相关资源
    最近更新 更多