Если вы объявляете Decodable
свойства с тем же именем, что и ключ в json
, тогда вам не нужно enum
для определения Coding
ключей и инициализатор для ручного сопоставления каждого свойства с ключом.
Кроме того, нет необходимости наследовать от NSObject
в Swift
, пока у вас не будет конкретного варианта использования для этого.Глядя на объявление, оно кажется ненужным, поэтому ваш GeneralResponse
может быть переопределен так просто:
class GeneralResponse<T: Decodable>: Decodable {
var code: Int
var status: Bool
var message: String?
var response : T?
}
Аналогично, ItemDemoModel
может быть объявлен следующим образом:
class ItemDemoModel: Decodable {
var id: Int
}
Теперь вы можете настроить свой сервис, как показано ниже, чтобы получить GeneralResponse<T>
для любого запроса,
struct RequestObject {
var method: String
var path: String
var params: [String: Any]
}
class WebService {
private let decoder: JSONDecoder
public init(_ decoder: JSONDecoder = JSONDecoder()) {
self.decoder = decoder
}
public func decoded<T: Decodable>(_ objectType: T.Type,
with request: RequestObject,
completion: @escaping (GeneralResponse<T>?, Error?) -> Void) {
// Here you should get data from the network call.
// For compilation, we can create an empty object.
let data = Data()
// Now parsing
do {
let response = try self.decoder.decode(GeneralResponse<T>.self, from: data)
completion(response, nil)
} catch {
completion(nil, error)
}
}
}
Использование
let request = RequestObject(method: "GET", path: "https://url.com", params: [:])
WebService().decoded([ItemDemoModel].self, with: request) { (response, error) in
if let items = response?.response {
print(items)
}
}
PS;Вы должны быть использованы для объявления массивов и словарей, как показано ниже:
let array: Array<SomeType>
let dictionary: Dictionary<String: SomeType>
let arrayOfDictionary: Array<Dictionary<String: SomeType>>
Но с помощью Swift
вывода типа вы можете объявить array
и dictionary
так же просто, как показано ниже,
let array: [SomeType]
let dictionary: [String: SomeType]
let arrayOfDictionary: [[String: SomeType]]