获取KeyPath的特定CodingKey

时间:2017-10-01 11:32:31

标签: ios swift swift4 key-value-coding codable

考虑以下对象:

struct User: Codable {
    let id: Int
    let email: String
    let name: String
}

为给定的CodingKey获取特定的KeyPath是否可行?

let key = \User.name.codingKey  // would be equal to string: "name"

2 个答案:

答案 0 :(得分:2)

使用Swift 4,我认为您不能自动从相应的CodingKey对象中检索KeyPath,但您可以随时破解它;)< / p>

例如,在相同的 User类型的Swift源文件中,添加以下extension

fileprivate extension User {
    static func codingKey(for keyPath: PartialKeyPath<User>) -> CodingKey {
        switch keyPath {
        case \User.id:    return CodingKeys.id
        case \User.email: return CodingKeys.email
        case \User.name:  return CodingKeys.name
        default: fatalError("Unexpected User key path: \(keyPath)")
        }
    }
}

然后在受约束的codingKey超类中实现所需的KeyPath API:

extension PartialKeyPath where Root == User {
    var codingKey: CodingKey {
        return User.codingKey(for: self)
    }
}

最后,用法紧跟您的代码:

let name: CodingKey = (\User.name).codingKey
print("\(name)") // prints "name"

这可能是一个有点乏味且容易出错的解决方案,但是,如果您只需要少数类型的此功能,我认为这是完全可行的;)

<强>注意事项即可。当然,对于CodingKeys enum private可见性,外部定义的类型,此hack不起作用。 (例如,对于Swift标准库定义的所有Codable类型。)

答案 1 :(得分:-3)

我认为您不能将属性直接转换为字符串,但您可以使用反射实现类似的功能,但您必须创建结构的实例:

seek()