首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIFT4.1数组到key = value (key包含一个值)的可编码采用

SWIFT4.1数组到key = value (key包含一个值)的可编码采用
EN

Stack Overflow用户
提问于 2018-06-02 08:48:39
回答 1查看 868关注 0票数 3

如何使用Swift可编码协议将存储在Swift中的数据解码/编码为一个对象数组(只有2个值)到一个(JSON或其他类型的数据表示;应该无关紧要) key = value结构,如下所示:

正如您所看到的,它是一个timestamp = value符号结构(我对时间戳的格式化没有问题,没关系)

(我知道以前已经回答过关于存储在键中的数据的问题,但是我的问题是不同的,因为它特定于只有两个值在平面键=值结构中转换的对象数组)。

下面是我的代码,它处理两个对象:

MetricResult =包含时间戳和度量值

MetricResults =包含一个应该正确编码的MetricResult数组。

我已经为MetricResult进行了编码,但当我阅读时,我不知道如何处理包含实际数据本身的变量键。

代码语言:javascript
复制
struct MetricResult : Codable {
    var date   = Date()
    var result = Int(0)

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: Date.self)
        try container.encode(result, forKey: date)
    }

    init(from decoder: Decoder) throws {
        //how do deal with variable key name here??
    }
}

struct MetricResults: Codable {

    var results = [MetricResult]()

    func encode(to encoder: Encoder) throws {
        //how do deal with variable key name here??
    }

    init(from decoder: Decoder) throws {
        //how do deal with variable key name here??
    }
}

extension Date: CodingKey {

    //MARK: - CodingKey compliance

    public init?(intValue: Int)       {
        return nil
    }

    public init?(stringValue: String) {
        self.init(stringFirebase: stringValue)
    }

    public var intValue: Int?{
        return nil
    }

    public var stringValue: String {
        return stringFirebase()
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 13:58:41

您已经非常接近了;您已经完成了最棘手的部分,即如何将日期设置为CodingKey (请务必标记此private;系统的其他部分也可能希望以另一种方式将Date作为CodingKey使用)。

主要问题是,在这个规范中,MetricResult本身是不能编码的。您不能只编码“键值对”。只能作为某物(即字典)的一部分进行编码。所有的编码/解码都必须由MetricResults这样做:

代码语言:javascript
复制
extension MetricResults: Codable {
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: Date.self)
        for result in results {
            try container.encode(result.result, forKey: result.date)
        }
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: Date.self)
        for date in container.allKeys {
            let result = try container.decode(Int.self, forKey: date)
            results.append(MetricResult(date: date, result: result))
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50655126

复制
相关文章

相似问题

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