Обобщение функции для сопоставления JSON и Object с использованием ObjectMapper и swift 3

Я разрабатываю проект в Swift 3, используя ObjectMapper и у меня много функций, использующих один и тот же код.

Функция, которая выполняет преобразование, такова:

    func convertCategories (response:[[String : Any]]) {

    let jsonResponse = Mapper<Category>().mapArray(JSONArray: response )

    for item in jsonResponse!{
        print(item)
        let realm = try! Realm()
        try! realm.write {
            realm.add(item)
        }
    }

}

И я хочу передать Category (Mapper) в качестве аргумента, чтобы я мог передать любой тип Class Type в функцию и использовать только одну функцию для выполнения работы, это будет выглядеть так:

    func convertObjects (response:[[String : Any]], type: Type) {

    let jsonResponse = Mapper<Type>().mapArray(JSONArray: response )

...

Я много думал, но безрезультатно: "Может ли кто-нибудь помочь мне достичь этого?

Отредактировано: для всех с той же проблемой, решение заключается в следующем:

    func convertObjects <Type: BaseMappable> (response:[[String : Any]], type: Type)
{
    let jsonResponse = Mapper<Type>().mapArray(JSONArray: response )



    for item in jsonResponse!{
        print(item)
        let realm = try! Realm()
        try! realm.write {
            realm.add(item as! Object)
        }
    }


}

И вызвать функцию это:

self.convertObjects(response: json["response"] as! [[String : Any]], type: type)

1 ответ

Решение

Я подозреваю, что у вас просто проблема с синтаксисом. Что вы имеете в виду что-то вроде:

func convertObjects<Type: BaseMappable>(response:[[String : Any]], type: Type)

Вы также можете написать это так (что иногда более читабельно, особенно когда все становится сложнее):

func convertObjects<Type>(response:[[String : Any]], type: Type)
    where Type: BaseMappable {

Вы обычно называете это как:

convertObjects(response: response, type: Category.self)

Дело в том, что convertObjects должен быть специализирован для каждого типа, который вы хотите преобразовать, и это требует объявления параметра типа (<Type>).

Другие вопросы по тегам