获取Swift中密钥路径的编码密钥

获取Swift中密钥路径的编码密钥,swift,codable,swift-keypath,Swift,Codable,Swift Keypath,我拥有的:一个具有不同属性的可编码结构 我想要的是:一个函数,在这个函数中,当属性用Json编码时,我可以得到它的确切名称。我认为最有希望的方法是使用Keypath,但我不知道如何以及是否可能。谢谢 由于Codable类型的属性与其编码键之间不存在1-1映射,因此无法立即执行此操作,因为可能存在不属于编码模型的属性或依赖于多个编码键的属性 但是,您应该能够通过定义属性与其编码键之间的映射来实现目标。您使用KeyPaths的方法是正确的,您只需要定义一个函数,该函数接受一个根类型为您的可编码模型的

我拥有的:一个具有不同属性的可编码结构


我想要的是:一个函数,在这个函数中,当属性用Json编码时,我可以得到它的确切名称。我认为最有希望的方法是使用Keypath,但我不知道如何以及是否可能。谢谢

由于
Codable
类型的属性与其编码键之间不存在1-1映射,因此无法立即执行此操作,因为可能存在不属于编码模型的属性或依赖于多个编码键的属性

但是,您应该能够通过定义属性与其编码键之间的映射来实现目标。您使用
KeyPath
s的方法是正确的,您只需要定义一个函数,该函数接受一个根类型为您的可编码模型的
KeyPath
,并从所述函数返回编码密钥

struct MyCodable: Codable {
    let id: Int
    let name: String

    // This property isn't part of the JSON
    var description: String {
        "\(id) \(name)"
    }

    enum CodingKeys: String, CodingKey {
        case name = "Name"
        case id = "identifier"
    }

    static func codingKey<Value>(for keyPath: KeyPath<MyCodable, Value>) -> String? {
        let codingKey: CodingKeys
        switch keyPath {
        case \MyCodable.id:
            codingKey = .id
        case \MyCodable.name:
            codingKey = .name
        default: // handle properties that aren't encoded
            return nil
        }
        return codingKey.rawValue
    }
}

MyCodable.codingKey(for: \.id)
struct MyCodable:Codable{
让id:Int
let name:String
//此属性不是JSON的一部分
变量说明:字符串{
“\(id)\(姓名)”
}
枚举编码键:字符串,编码键{
case name=“name”
案例id=“标识符”
}
静态函数编码键(对于keyPath:keyPath)->字符串{
let codingKey:codingKey
开关键路径{
case\MyCodable.id:
codingKey=.id
case\mycadable.name:
codingKey=.name
默认值://未编码的句柄属性
归零
}
返回codingKey.rawValue
}
}
MyCodable.codingKey(用于:\.id)

编码键不一定与属性对应。碰巧大多数用例都是这样。很好。不过,我的目标是一种通用/模板化方法,用于默认编码键。我想这是不可能的!很好,但是把那种类型的“s”去掉!并使其成为该类型的下标,而不是方法。e、 g.
MyCodable.CodingKey[\.id]?.rawValue
或初始值设定项。@NicolasDegen很遗憾,没有,因为您无法访问默认的编码键,因为它们是由编译器合成的,并且没有公开