繁体   English   中英

Swift 将结构作为函数参数传入

[英]Swift pass in struct as function parameter

我有一个像这样的 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 init方法struct ,而不是结构类型的“类”的名称(例如ModelStruct)?

最终,应该在这个函数中使用 struct 参数

try newJSONDecoder.decode(model.self, from:data!) ,所以第二个问题是如何将它放入该函数 - 如果打印为字符串将无法工作。

您可以执行以下操作:

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)

这是我如何将通用 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)
    }


}
)}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM