Утилита Swift 4 JSONDecoder для произвольной структуры - PullRequest
3 голосов
/ 08 апреля 2019

Я пытаюсь создать служебную функцию, которая дает некоторые Data и struct, который соответствует Decodable, может декодировать данные JSON в структуру следующим образом:

func decodeDataToModel(data : Data?, model : Decodable) -> Decodable? {
    guard let data = data else { return nil }
    let object : Decodable?
    do {
       object = try JSONDecoder().decode(model, from: data)
    } catch let decodeErr {
       print("Unable to decode", decodeErr)
    }
    return object
}

Это выдает ошибку: Cannot invoke decode with an argument list of type (Decodable, from: Data). Как я могу заставить эту функцию работать с любой произвольной структурой, которую я могу передать в качестве модели?

Например, если у меня есть:

struct Person : Decodable {
   let id : Int
   let name: String
}

struct Animal : Decodable {
   let id : Int
   let noOfLegs: Int
}

Я хочу иметь возможность использовать его вот так

let animal = decodeDataToModel(someData, from: Animal.self)
let human = decodeDataToModel(someOtherData, from: Person.self)

1 Ответ

2 голосов
/ 08 апреля 2019

Вы можете попробовать

func decodeDataToModel<T:Decodable>(data : Data?,ele:T.Type) -> T? {
    guard let data = data else { return nil } 
    do {
        let object = try JSONDecoder().decode(T.self, from: data)
        return object
    } catch  {
        print("Unable to decode", error)
    }
    return nil
}

Вызов

let animal = decodeDataToModel(data:<#animaData#>, ele: Animal.self)
...