首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift -将[String: Any]数组保存到NSUserDefauls

Swift -将[String: Any]数组保存到NSUserDefauls
EN

Stack Overflow用户
提问于 2019-07-30 11:43:54
回答 2查看 570关注 0票数 1

我发现这个扩展可以使用可编码保存到NSUserDefaults中。

代码语言:javascript
运行
复制
extension UserDefaults {
    func decode<T : Codable>(for type : T.Type, using key : String) -> T? {
        let defaults = UserDefaults.standard
        guard let data = defaults.object(forKey: key) as? Data else {return nil}
        let decodedObject = try? PropertyListDecoder().decode(type, from: data)
        return decodedObject
    }

    func encode<T : Codable>(for type : T, using key : String) {
        let defaults = UserDefaults.standard
        let encodedData = try? PropertyListEncoder().encode(type)
        defaults.set(encodedData, forKey: key)
        defaults.synchronize()
    }
}

但正如我所看到的,由于Type 'OfflineRequest' does not conform to protocol 'Decodable'的存在,我有一个错误看起来像Any

我想保存下一个结构:

代码语言:javascript
运行
复制
struct OfflineRequest: Codable {
    let url: String
    let params: [String: Any]
}

其想法是持久存储由于任何连接问题而失败的请求的堆栈(数组)。因此,我有Core数据模型,并将其属性转换为String: Any,然后将其发送到服务器。但是现在我想要创建离线第一算法。因此,如果用户离线,我希望持久存储url和params,即String: Any。在这种情况下如何正确处理does not conform to protocol 'Decodable'

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-30 15:06:53

您可以使用JSONSerialization.data(withJSONObject: Any)对您的字典进行编码,并使用JSONSerialization.JSONObject(with: Data)对其进行解码。您只需要确保传递一个有效的json对象(在本例中是一个字典),如果您传递一个类型为Date的字典,它就会崩溃。就像这样:

代码语言:javascript
运行
复制
struct OfflineRequest: Codable {
    let url: String
    let params: [String: Any]
}
代码语言:javascript
运行
复制
extension OfflineRequest {
    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        url = try container.decode(String.self)
        params = try JSONSerialization.jsonObject(with: container.decode(Data.self)) as? [String:Any] ?? [:]
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.unkeyedContainer()
        try container.encode(url)
        try container.encode(JSONSerialization.data(withJSONObject: params))
    }
}
代码语言:javascript
运行
复制
let test = [OfflineRequest(url: "http://www.google.com", params: ["a":"1","b":"test", "c":["d":"test"]])]

let data = try! JSONEncoder().encode(test)
let loaded = try! JSONDecoder().decode([OfflineRequest].self, from: data)
print(loaded) // [__lldb_expr_3.OfflineRequest(url: "http://www.google.com", params: ["b": test, "a": 1, "c": {\n    d = test;\n}])]\n"
票数 4
EN

Stack Overflow用户

发布于 2019-07-30 11:55:06

由于[String:Any],您正在出错,我建议您使用JSONSerialization.data[String:Any]转换为Data

然后你就可以像这样用

代码语言:javascript
运行
复制
struct OfflineRequest: Codable {
    let url: String
    let params: Data


    enum CodingKeys: String, CodingKey {
        case url
        case params

    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        params = try values.decode(Data.self, forKey: .params)
        url = try values.decode(String.self, forKey: .url)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(url, forKey: .url)
        try container.encode(params, forKey: .params)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57270873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档