gpt4 book ai didi

ios - 如何在 Swift 4 中将 Encodable 或 Decodable 作为参数传递?

转载 作者:可可西里 更新时间:2023-11-01 00:38:47 25 4
gpt4 key购买 nike

我正在学习 JSONParsing。我按照教程进行操作,得到的是:

    guard let url = URL(string: "http://localhost/test-api/public/api/register") else { return }

var request = URLRequest(url: url)

request.httpMethod = "POST"

let newUser = User.init(name: self.collectionTF[0].text, email: self.collectionTF[1].text, password: self.collectionTF[2].text)

do {

let jsonBody = try JSONEncoder().encode(newUser)

request.httpBody = jsonBody

} catch { }

URLSession.shared.dataTask(with: request) { (data, response, error) in

guard let data = data else { return }

do {

let json = try JSONSerialization.jsonObject(with: data) as? [String:Any]

print(json!)

DispatchQueue.main.async {

if json!["status"] as! Int == 200
{
GeneralHelper.shared.keepLoggedIn()

NavigationHelper.shared.moveToHome(fromVC: self)
}

}

} catch { print(error.localizedDescription)}

}.resume()

好的,这就是我为注册所做的。现在,我想创建一个 Helper,它将使用 @escaping 做同样的事情,因为我们都需要解析的 JSON 作为返回。

所以,我将 endPoint 作为字符串传递,然后尝试传递这个 newUser,它是一个 Encodable,它可以是一个 Decodable以及在未来,但它会抛出错误 Cannot invoke 'encode' with an argument list of type '(Codable)'。有人可以帮忙吗?而且,当涉及到 JSONParsing 时,通过多次调用此函数,这种方式是否更好?

编辑:- 因此,我现在正在使用 networkRequestfunction,这就是我所做的。

 let newData = User.init(name: "Rob", email: "abc@gmail.com", password: "12345678")

ApiHelper.sharedInstance.networkRequest_Post(urlString: "register", header: nil, encodingData: newData) { (response: User, urlRes, error) in
<#code#> }

现在,它给了我这个错误:无法将类型 '(User, _, _) -> ()' 的值转换为预期的参数类型 '(_?, HTTPURLResponse?, Error?) -> ( )'。有帮助吗?

最佳答案

我在我的项目中使用了相同的功能

希望下面的代码能帮到你

    func networkRequest_Post<T: Decodable, Q: Encodable>(urlString: String,header:[String:String]?,encodingData: Q,completion: @escaping (T?, HTTPURLResponse?, Error?) -> ()) {

guard let url = URL(string: urlString) else { return }
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 300.0
config.timeoutIntervalForResource = 300.0
if header != nil{
config.httpAdditionalHeaders = header
}
let session = URLSession(configuration: config)
var request = URLRequest(url: url)
request.httpMethod = "POST"
do {
let jsonBody = try JSONEncoder().encode(encodingData)
request.httpBody = jsonBody
} catch {}
let task = session.dataTask(with: request) { (data,response, err) in

if let response = response {
print(response)
}
if let err = err {
print("Failed to fetch data:", err.localizedDescription, "Error Description\(err)")
return
}
guard let data = data else { return }
do {
print(String(data: data, encoding: String.Encoding.utf8) as Any)
let dataReceived = try JSONDecoder().decode(T.self, from: data)
completion(dataReceived,response as? HTTPURLResponse,err)
} catch let jsonErr {
print("Failed to serialize json:", jsonErr, jsonErr.localizedDescription)
completion( nil,response as? HTTPURLResponse,jsonErr)
}
}
task.resume()
}

使用 -

         let newdata = User(name: "Abhi", email: "jhjhj@jhj.co", password: "123hguhj")
networkRequest_Post(urlString: "YOUR_URL", header: nil, encodingData: newdata) { (RESPONSE_DATA:User?, URL_RESPONSE, ERROR) in
// Do your network work here
}

struct User : Codable {
var name: String?
var email: String?
var password: String?
}

关于ios - 如何在 Swift 4 中将 Encodable 或 Decodable 作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53002582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com