代码之家  ›  专栏  ›  技术社区  ›  EvGeniy Ilyin

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

  •  0
  • EvGeniy Ilyin  · 技术社区  · 6 年前

    例如,我有一个可编码结构 User :

    struct User: Codable {
        // ...
        var psnTag: String?
        var xblTag: String?
        var steamTag: String?
        var nintendoTag: String?
        var instagramId: String?
        // ...
    }
    

    和stringKey作为 String =“psnTag”

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

    let stringKey = "psnTag"
    user.hasKeyForPath(stringKey) //return Bool
    user.valueForPath(stringKey) //return AnyObject
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Robert Dresler Gustavo Vollbrecht    6 年前

    从扩展开始 Encodable hasKey 以及 value

    使用镜子

    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
        }
    }
    

    使用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]
        }
    }
    

    .hasKey(for: "key") //returns Bool
    .value(for: "key") //returns Any?