Быстрый проход в структуре как параметр функции - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть класс синтаксического анализа JSON, вот так

class JSONParser: NSObject {
    let newJSONDecoder : JSONDecoder
    let data : Data

    init(decoder: JSONDecoder, data: Data, model:  ) {
        self.newJSONDecoder = JSONDecoder()
        self.data = data
    }
}

Цель состоит в том, чтобы параметр model был классом, который может принимать любые данные и любую модель, создавать объект и возвращать его в вызывающий экземпляр класса. EG ниже

let jsonParser = JSONParser(myDecoder, data, struct)
let parsedArray = jsonParser.createJSONArray()

Могу ли я передать структуру в метод инициализации JSONParser типа struct, а не имя типа "class" struct struct (например, ModelStruct)?

В конце концов, параметр struct должен использоваться в этой функции

try newJSONDecoder.decode(model.self, from:data!), поэтому вторая проблема заключается в том, как включить ее в эту функцию - не будет работать, если вывести ее в виде строки.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Вот как я передаю обобщенную структуру Codable в качестве параметра, а также возвращаю ее через обработчик завершения в качестве параметра allGeneric:

func getAccordingToWebServiceFlag<T:Decodable>(flagSender: WebServicesFlagSenders,codableStruct: T.Type ,completionHandler: @escaping ( _ publicDataResponseModel:T?,_ flagSender: WebServicesFlagSenders) -> Void) {

excuteServerOperation(nil, imageData: nil, url:ServerAPIServant.webServiceFullURL(webServicesFlagSenders: flagSender), way: .get, flagSender: flagSender,completionHandler: { (result, flagSender) in
    AppDelegate().printStringBy_ispha(string: "  \(flagSender) Hmmm ? \(result)")
    do {
        let jsonData = try JSONSerialization.data(withJSONObject:  result , options: .prettyPrinted)
        let decodableResponse = try! JSONDecoder().decode(codableStruct, from: jsonData)

        HelpingMethods.printCustomObjectBy_ispha(anyObject: decodableResponse as AnyObject)
        completionHandler(decodableResponse,flagSender)
    } catch let error {
        HelpingMethods.printStringBy_ispha(string: "? Codable failure with error = \(error.localizedDescription)")
         completionHandler(nil,flagSender)
    }


}
)}
0 голосов
/ 04 сентября 2018

Вы можете сделать что-то вроде ниже:

class JSONParser: NSObject {
    let newJSONDecoder : JSONDecoder
    let data : Data

    init<T: Codable>(data: Data, model: T.Type) {
        self.newJSONDecoder = JSONDecoder()
        do {
        let result = try self.newJSONDecoder.decode(model.self, from: data)
        print(result)
        } catch let err {
            print(err.localizedDescription)
        }
        self.data = data
    }
}

Структура вашей модели:

struct TestModel: Codable {
    let name: String
    let age: Int
}

Как вы называете init:

let str = """
        {"name": "Robert", "age" : 35}
        """

    let data = str.data(using: .utf8)
    let jsonParser = JSONParser(data: data!, model: TestModel.self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...