获取可编码(或可分解)中的所有密钥

时间:2019-07-29 02:46:38

标签: swift

给出以下可编码的struct

struct MyBanana: Codable {
    var b: String?
    var z: String?

    enum CodingKeys: String, CodingKey {
        case b = "B"
        case z = "ZOOM"
    }
}

我如何获得像这样的字符串数组:["B", "ZOOM"]而没有MyBanana的实例?

此外,还有一种方法可以从自动合成的CodingKeys中获取此信息,例如

    struct MyBanana: Codable {
        var b: String?
        var z: String?
    }

将返回["b","z"]

对于第一个问题,我尝试了以下操作:

func whatever<T, Key>(keyedBy: Key.Type) -> [T] where T: Codable, Key: CodingKey
{
    let allKeys: [Key] = [Key]()
    for k in keyedBy {
        allKeys.append(k)
    }

    return [T]()
}

但是我得到

  

类型'Key.Type'不符合协议'序列'

1 个答案:

答案 0 :(得分:2)

struct MyBanana: Codable {
  var b: String?
  var z: String?

  enum CodingKeys: String, CodingKey, CaseIterable {
    case b = "B"
    case z = "ZOOM"
  }

  static var allCases: [String] {
    return CodingKeys.allCases.map { $0.rawValue }
  }
}

然后您可以将编码键数组作为

MyBanana.allCases

但是不适用于自动合成的编码键