ObjectMapper: использование отражения в функции карты - PullRequest
0 голосов
/ 15 мая 2018

Я некоторое время пользуюсь ObjectMapper и нахожу трудным написать функцию карты для классов с большим количеством свойств, используя способ, описанный в документах:

func mapping(map: Map) {
    username    <- map["username"]
    age         <- map["age"]
    weight      <- map["weight"]
    array       <- map["array"]
    dictionary  <- map["dictionary"]
    bestFriend  <- map["bestFriend"]
    friends     <- map["friends"]
}

Интересно, возможно ли этоиспользовать отражение, чтобы написать функцию карты, как показано ниже, предполагая, что мои данные JSON и мой класс имеют точно такие же имена свойств:

func mapping(map: Map) {
    let names = Mirror(reflecting: self).children.flatMap { $0.label }
    for name in names {
        self.value(forKey: name) <- map[name]
    }
}

ОБНОВЛЕНИЕ:

На основании ответа Sweeper IЯ обновил мой код:

func mapping(map: Map) {
    for child in Mirror(reflecting: self).children.compactMap({$0}) {
        child <- map[child.label]
    }
}

Я думаю, это должно сработать.

ОБНОВЛЕНИЕ 2:

Благодаря Sweeper я нашел свойпервоначальное предположение было неверным, и Child - это всего лишь набросок шрифта для:

public typealias Child = (label: String?, value: Any)

Так что моя вторая попытка также не сработает.

1 Ответ

0 голосов
/ 15 мая 2018

Оператор <- объявлен так:

public func <- <T: RawRepresentable>(left: inout T, right: Map) {
    left <- (right, EnumTransform())
}

Как видите, левый параметр объявлен inout. Это означает, что вы должны использовать изменяемую переменную, а не возвращаемое значение какого-либо метода.

Так что вам нужно написать все свойства.

Я нашел этот плагин, который генерирует для вас отображение: https://github.com/liyanhuadev/ObjectMapper-Plugin

В Swift 4 вводится Codable, но он автоматически работает для вас:

struct Foo: Codable {
    var username: String
    var age: Int
    var weight: Double

    // everything is done for you already! You don't need to write anything else
}
...