将协议传递给完成处理程序

时间:2018-04-19 14:26:03

标签: ios swift swift4

早上堆栈溢出,我在下面写了一些代码,这是一个项目的摘录,主要目标是更熟悉swift4 / iOS中的网络,并通过完成处理程序和闭包构建更多的直觉和舒适度。我对这个程序的意图是创建一个通用的类,我可以将任何对象传递给JSONDecoder(),只要它符合可解码/可编码。例如,我想编写与此类似的东西,所以我可以创建任何struct / class,只要它符合codable / decable,我就可以将它传递给函数并拥有JSONDecoder()。decode,work魔法并将数据吐入完成处理程序,以便我可以随意使用它。

typealias jsonTaskCompletionHandler = (_ decodableObject: Decodable) -> Void

func getData(with url : String, completionHandler completion: @escaping jsonTaskCompletionHandler){
    let newURL = URL(string: url)
    self.session.dataTask(with: newURL!) { (data, _, _) in
        guard let data = data else {return }
        print(data)
        do {
            let jsonData = try JSONDecoder().decode(decodableObject.self, from: data)
            return completion(decodableObject)
        } catch {
            print("decoding error")
        }
        }.resume()
}

相反,我正在硬编码'jsonStructure'以使其正常工作。

typealias jsonTaskCompletionHandler = (jsonStructure) -> Void

func getData(with url : String, completionHandler completion: @escaping jsonTaskCompletionHandler){
    let newURL = URL(string: url)
    self.session.dataTask(with: newURL!) { (data, _, _) in
        guard let data = data else {return }
        print(data)
        do {
            let jsonData = try    JSONDecoder().decode(jsonStructure.self, from: data)
            return completion(jsonData)
        } catch {
            print("decoding error")
        }
        }.resume()

}
}

    @IBAction func getData(_ sender: UIButton) {
    print("button press")
    let networkCL = networkClient()
    networkCL.getData(with: "someURL") { (objectThatConformsToCodable)   in
        print(objectThatConformsToCodable)
    }
}

使问题更清楚。我想将任何符合可编码的数据结构/ Object传递给JSONDecoder()。decode并让完成处理程序返回JSON数据作为符合可编码的对象的实例,而不是我很难编码特定的数据类型进入

data = JSONDecoder.decode(dataType.self) 
completion(data)

而我只想传入

data = JSONDecoder.decode(anyDataStructureThatIsCodable.self)
completion(data)

任何想法?提前谢谢!

0 个答案:

没有答案