繁体   English   中英

获取KeyPath的特定CodingKey

[英]Get specific CodingKey for KeyPath

考虑以下对象:

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

为给定的KeyPath获取特定的CodingKey是否CodingKey

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

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

例如,在相同的 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)")
        }
    }
}

然后在受约束的KeyPath超类中实现所需的codingKey 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枚举private可见性的情况下,这种黑客行为不适用于外部定义的类型。 (例如,对于Swift标准库定义的所有Codable类型。)

我不认为你可以直接将属性转换为字符串,但你可以使用反射实现类似的东西,但你必须创建一个struct的实例:

let user = User(id: 1, email: "sample@email.com", name: "just_name")
Mirror(reflecting: user).children.first?.label

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM