Swift传递方法参数Struct Decodable

时间:2017-12-07 13:35:52

标签: json swift decodable

,Swift 4如何在方法参数中传递Decodable Struct并在JSONDecoder()中解析它? 错误:

  

无法调用'解码'使用类型'的参数列表(可解码,   来自:数据)'

struct JsonRespons: Codable {
    let uid: String
    let msisdn: String
    let APK: String
    let fname: String
    let lname: String
}

struct JsonResponsError: Decodable {
    let uid: String
    let error: String
}

extension UIView {

func phoneAuth(serverApi path:String, jsonStruct:Codable){
    let jsonUrlString = Globals.JOSN_API_URL + path
    guard let url = URL(string: jsonUrlString) else {
        return

    }

    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard err == nil else {
            return
        }

        guard let data = data else { return }

        do {
            let result = try JSONDecoder().decode(jsonStruct.self, from: data)
            self.handleJsonResult(resalt: result as AnyObject)

        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }

    }.resume()
}


    func handleJsonResult(resalt:AnyObject){
        print(resalt)
    }

}

2 个答案:

答案 0 :(得分:2)

Codable添加到Landmark的继承列表会触发满足Encodable and Decodable所有协议要求的自动一致性:

您可以使用Codable

struct Landmark: Codable {
    var name: String
    var foundingYear: Int

    // Landmark now supports the Codable methods init(from:) and encode(to:), 
    // even though they aren't written as part of its declaration.
}

替代解决方案是

func phoneAuth(serverApi path: String, Completion block: @escaping ((Data) -> ())) {

    URLSession.shared.dataTask(with: URL(string: url)!) { (data, res, err) in

        if let d = data {
            block(d)
        }
    }.resume()
}

调用方法

phoneAuth(serverApi: "yourUrl") { (data) in

    do {
        let result = try JSONDecoder().decode(YourDecodable.self, from: data)
    } catch let jsonErr {
        print("Error serializing json:", jsonErr)
    }
}

答案 1 :(得分:0)

您不必将其作为参数传递,可以实现如下所示的解码

extension UIView {

func phoneAuth(serverApi path:String){
    let jsonUrlString = Globals.JOSN_API_URL + path
    guard let url = URL(string: jsonUrlString) else {
        return

}

URLSession.shared.dataTask(with: url) { (data, response, err) in
    guard err == nil else {
        return
    }

    guard let data = data else { return }

    do {
        let result = try JSONDecoder().decode(JsonRespons.self, from: data)
        self.handleJsonResult(resalt: result as AnyObject)

    } catch let jsonErr {
        print("Error serializing json:", jsonErr)
    }

}.resume()
}