考虑以下对象:
struct User: Codable {
let id: Int
let email: String
let name: String
}
let key = \User.name.codingKey // would be equal to string: "name"
使用 Swift 4,我认为您不能自动CodingKey
从相应的对象中检索 a ,KeyPath
但您可以随时破解它;)
例如,在同一 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
API KeyPath
:
extension PartialKeyPath where Root == User {
var codingKey: CodingKey {
return User.codingKey(for: self)
}
}
最后,用法与您的代码密切相关:
let name: CodingKey = (\User.name).codingKey
print("\(name)") // prints "name"
这可能是一个有点乏味且容易出错的解决方案,但是,如果您只需要为少数类型提供此功能,那么在我看来它是完全可行的;)
注意事项。当然,这种 hack 不适用于给定CodingKeys
枚举private
可见性的外部定义类型。(例如,对于Codable
Swift 标准库定义的所有类型。)
我不认为你可以将属性直接转换为字符串,但你可以使用反射来实现类似的事情,但你必须创建一个结构的实例:
let user = User(id: 1, email: "sample@email.com", name: "just_name")
Mirror(reflecting: user).children.first?.label