【发布时间】:2018-06-19 15:01:19
【问题描述】:
我使用使用 Alamofire 的 iOS 应用程序,我想编写一个通用函数,用于将数据从服务器发送和检索到可解码对象,我的函数如下:
func pop <T : Codable> (_ Url: inout String, _ popedList: inout [T]) {
let url = URL(string:Url)
Alamofire.request(url!, method: .post).responseJSON { response in
let result = response.data
do {
let data = try JSONDecoder().decode(popedList, from: result!)// get error here
print(data[0])
let jsonEncoder = JSONEncoder()
let jsonData = try! jsonEncoder.encode(data[0])
let jsonString = String(data: jsonData, encoding: .utf8)
print("jsonString: \(String(describing: jsonString))")
} catch let e as NSError {
print("error : \(e)")
}
}
}
以及将对象发送到服务器的函数如下:
func push <T : Codable> (_ Url: inout String, _ pushObject: inout T) {
let jsonData = try! JSONEncoder().encode(pushObject)
let jsonString = String(data: jsonData, encoding: .utf8)
print("jsonString: \(String(describing: jsonString))")
let url = URL(string:Url)
Alamofire.request(url!,
method: .post,
parameters:jsonString)//it's need to creat a Dictionary instate of String
.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"])
.response { response in
// response handling code
let result = response.data
print(response.data)
}
}
我在第一个函数中遇到错误,
“不能使用类型为'([T], from: Data)'的参数列表调用'decode'”
和
“转义闭包只能通过值显式捕获inout参数”
编写这些以实现泛型功能的最佳方法是什么?
【问题讨论】:
-
这两个函数都有很多不好的做法。除非绝对需要,否则不应在 Swift 中使用
inout参数。也不要使用强制转换、强制解包和强制尝试,优雅地处理错误。
标签: swift alamofire generic-programming decodable