可编码结构:通过键获取值

EvG*_*yin 1 key-value-coding swift

例如,我有可编码的结构User

struct User: Codable {
    // ...
    var psnTag: String?
    var xblTag: String?
    var steamTag: String?
    var nintendoTag: String?
    var instagramId: String?
    // ...
}
Run Code Online (Sandbox Code Playgroud)

和 stringKey as String= "psnTag"

如何通过 stringKey 从实例中获取值?

像这样:

let stringKey = "psnTag"
user.hasKeyForPath(stringKey) //return Bool
user.valueForPath(stringKey) //return AnyObject
Run Code Online (Sandbox Code Playgroud)

Rob*_*ler 5

从扩展Encodable协议开始并声明方法 forhasKey和 forvalue

使用镜子

extension Encodable {
    func hasKey(for path: String) -> Bool {
        return Mirror(reflecting: self).children.contains { $0.label == path }
    }
    func value(for path: String) -> Any? {
        return Mirror(reflecting: self).children.first { $0.label == path }?.value
    }
}
Run Code Online (Sandbox Code Playgroud)

使用 JSON 序列化

extension Encodable {
    func hasKey(for path: String) -> Bool {
        return dictionary?[path] != nil
    }
    func value(for path: String) -> Any? {
        return dictionary?[path]
    }    
    var dictionary: [String: Any]? {
        return (try? JSONSerialization.jsonObject(with: JSONEncoder().encode(self))) as? [String: Any]
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以像这样使用它:

.hasKey(for: "key") //returns Bool
.value(for: "key") //returns Any?
Run Code Online (Sandbox Code Playgroud)