Codable Struct: получить ценность по ключу - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть, например, кодируемая структура 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 Ответ

0 голосов
/ 23 декабря 2018

Начните с расширения протокола 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?
...