[英]Get specific CodingKey for KeyPath
使用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.