获取 CodingKeys 键值

Posted

技术标签:

【中文标题】获取 CodingKeys 键值【英文标题】:Get the CodingKeys key value 【发布时间】:2020-07-31 19:17:21 【问题描述】:

在 Swift 中,使用 Codable 结构和 CodingKeys emum, 如果我有一个 Coordinate 对象,我怎样才能得到纬度和经度 CodingKeys 值,作为一个数组 ["1","2"]

struct Coordinate: Codable 
    var latitude: Bool?
    var longitude: Bool?
    var elevation: Bool?

    enum CodingKeys: String, CodingKey 
        case latitude = "1"
        case longitude = "2"
        case elevation = "3"
    

以及如何获取所有 CodingKeys 值,仅针对为 true 的变量? 例如,如果经度和海拔设置为 true,我将得到数组 ["2,"3"]

【问题讨论】:

我不清楚这里的问题是什么。鉴于您的字面问题,答案是var values: [String] if longitude == true && elevation == true return ["2", "3"] else return [] ,但我怀疑这不是您的意思。你在哪里解决你需要Bool?的问题。这是什么类型,只对三个轴说“是/否/未确定”? 为什么你的属性是 Bool 类型的,不应该都是 Double 吗? 所以在你的代码中你有 return ["2", "3"] 这不是我想要的。我想从枚举中获取值 你需要澄清你的意思,因为在你的问题中你说你想要一个字符串数组。此外,当您应该只问一个(明确)问题时,您似乎在问 2 个(不清楚)问题。 【参考方案1】:

CaseIterable 会有所帮助

struct Coordinate: Codable 
    var latitude: Bool?
    var longitude: Bool?
    var elevation: Bool?

    enum CodingKeys: String, CodingKey, CaseIterable 
        case latitude = "1"
        case longitude = "2"
        case elevation = "3"
    

    var allKeys: [String] 
        CodingKeys.allCases.map  $0.stringValue 
    

【讨论】:

【参考方案2】:

如果我理解正确,这样的事情可能会起作用:

let myCoordinates = Coordinate(latitude: true, longitude: false, elevation: true)
var myArray: [String] = []
if myCoordinates.latitude ?? false 
    myArray.append("1")

if myCoordinates.longitude ?? false 
    myArray.append("2")

if myCoordinates.elevation ?? false 
    myArray.append("3")

另外,谢谢!我不知道 Codable 存在,现在我想我可能会在我的项目中使用它!

【讨论】:

抱歉,Codable 不是用来解码或编码数据的方式 是的,我假设这是在数据被解码为这种格式之后。如果您想对其进行编码,则不会这样做。

以上是关于获取 CodingKeys 键值的主要内容,如果未能解决你的问题,请参考以下文章

解码 JSON 时出错 - keyNotFound(CodingKeys

排除不需要更改的 CodingKeys?

`convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`

当超类也是 Codable 时,如何在子类中使用 CodingKeys?

JSON解码时出错:Swift.DecodingError.keyNotFound(CodingKeys(stringValue:“cast”,intValue:nil)

Swift Parse JSON 错误:没有与键 CodingKeys 关联的值(stringValue: \"_source\