考虑以下对象:
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"
答案 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()