将结构体作为函数参数传递的Swift方法

3

我有一个 JSON 解析类,如下所示:

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

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

我们的目标是使model参数成为一个类,可以接受任何数据和模型,并创建一个对象并将其返回给调用类实例。例如:

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

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

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

try newJSONDecoder.decode(model.self, from:data!),因此第二个问题是如何将它传递到这个函数中——如果作为字符串打印,它是无法工作的。


你想传递特定的结构体还是通用的? - iVarun
通用结构体 - 主要用于解析 JSON,因为我没有使用类。目标是在初始化时让依赖项知道。 - noobsmcgoobs
为什么你不能只使用JSONDecoder呢? - Maxim Kosov
2个回答

4
您可以像下面这样做:
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)

我认为这会起作用。您能否为代码中的<T: Codable>部分添加一些解释? - noobsmcgoobs
@noobsmcgoobs <T: Codable> 定义了 model 的类型。在这里,model 必须是符合 Codable 协议的类型。 - iVarun

0

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


}
)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接