【问题标题】:Swift pass in struct as function parameterSwift 传入 struct 作为函数参数
【发布时间】:2018-09-04 05:04:23
【问题描述】:

我有一个这样的 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()

我可以将一个结构传递给struct 类型的JSONParser init 方法,而不是结构“类”名称类型(例如ModelStruct)吗?

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

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

【问题讨论】:

  • 你想传递特定的结构还是泛型?
  • 通用结构 - 基本上是为了解析 JSON,因为我没有使用类。目标是在初始化时让依赖关系知道。
  • 为什么不能直接使用JSONDecoder

标签: swift


【解决方案1】:

您可以执行以下操作:

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)

【讨论】:

  • 我认为这会奏效。您能否为&lt;T: Codable&gt; 部分代码添加解释?
  • @noobsmcgoobs &lt;T: Codable&gt; 定义 model 的类型。这里的模型必须是 Codable 类型。
【解决方案2】:

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


}
)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2013-03-01
    • 2016-03-05
    • 2016-02-16
    • 2013-12-10
    • 2017-11-04
    相关资源
    最近更新 更多