Здесь у нас есть сценарий, в котором я сталкиваюсь с проблемой синтаксического анализа класса модели с использованием "JSONDecoder".
Позвольте мне поделиться с вами тем, что я сделал в этом примере и где я столкнулся с проблемой:
- Существует модельный протокол, полученный через Codable.
- Структурная модель и класс A GenericExample
- Класс GenericExample имеет следующие вещи:
- общий экземпляр
- typeContainer, который является типом протокола
- Есть еще два метода staticClassParsing и dynamicClassParsing с одним параметром dynamicType
- В последнем методе One generi c, который возвращает анализируемая модель данных.
Вызов метода для анализа модели:
GenericExample.shared.dynamicClassParsing (Numbers.self, data: "[\ r \ n { \ "one \": \ "1 \"}, \ r \ n {\ "two \": \ "2 \"} \ r \ n] ")
Скомпилировать Ошибка времени:
Generi c параметр 'T' не может быть выведен
Произошло здесь
returnModelType: typeContainer.self
** Для более подробной информации, пожалуйста, go через следующий код: **
protocol BaseMapModel : Codable { }
struct Numbers: BaseMapModel {
var one: String?
var two: String?
}
class GenericExample: NSObject {
static let shared = GenericExample()
var typeContainer : BaseMapModel.Type?
private override init() {
super.init()
}
}
extension GenericExample {
// Static Class Parsing passed through the conversion
func staticClassParsing() {
let dataJson = "[\r\n{\"one\": \"1\"},\r\n{\"two\":\"2\"}\r\n]"
convertTypeContainer(data: Data(dataJson.utf8), returnModelType: Numbers.self) { (mappedResult) in
print(mappedResult?.one ?? "")
print(mappedResult?.two ?? "")
}
}
// Dynamic Class Parsing can't passed through the conversion
// Error:- Generic parameter 'T' could not be inferred
// Error Parameter:- in "returnModelType: typeContainer.self"
func dynamicClassParsing(_ dynamicType: BaseMapModel.Type, data:String) {
typeContainer = dynamicType.self
convertTypeContainer(data: Data(data.utf8), returnModelType: typeContainer.self) { (mappedResult) in
print(mappedResult?.one ?? "")
print(mappedResult?.two ?? "")
}
}
}
extension GenericExample {
private func convertTypeContainer<T : BaseMapModel>(data:Data, returnModelType: T.Type, completion: ((_ result:T?)->Void)) {
guard let responseModel = try? JSONDecoder().decode(returnModelType.self, from: data) else {
completion(nil)
return
}
completion(responseModel)
}
}