6

考虑以下对象:

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"
4

2 回答 2

4

使用 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)")
        }
    }
}

然后在受约束的超类中实现所需的codingKeyAPI 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可见性的外部定义类型。(例如,对于CodableSwift 标准库定义的所有类型。)

于 2017-10-07T17:06:16.670 回答
-3

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

let user = User(id: 1, email: "sample@email.com", name: "just_name")
Mirror(reflecting: user).children.first?.label
于 2017-10-01T13:02:03.267 回答