Обобщение функции для сопоставления 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>
).