您好我在swift中有一个Web服务工作者对象,它将完成块传递给调用者视图控制器。代码如下:
func getFlightData(for airportCode: String, minutesBehind:String, minutesAhead:String, completion: (([Flight], NSError) -> Void)?) {
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "xxxxxxx.com"
urlComponents.path = "/1/airports/"+airportCode+"/flights/flightInfo"
urlComponents.queryItems = [
URLQueryItem(name: "city", value: airportCode),
URLQueryItem(name: "minutesBehind", value: minutesBehind),
URLQueryItem(name: "minutesAhead", value: minutesAhead)
]
guard let url = urlComponents.url else { fatalError("Could not create URL from components") }
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("xxxxxxxxx", forHTTPHeaderField: "Authorization")
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
let task = session.dataTask(with: request) { (responseData, response, responseError) in
DispatchQueue.main.async {
if let error = responseError {
//completion block???
}
else if let jsonData = responseData {
let decoder = JSONDecoder()
do {
let posts = try decoder.decode([Flight].self, from: jsonData)
//completion?(posts, nil) ???? what to pass for Error? Successful call
} catch {
self.showError()
}
}
else {
//completion block???
self.showError()
}
}
}
task.resume()
}
当调用成功时,我将在完成块中传递什么值Error参数。我不能通过零,因为斯威夫特不让我这样做。有人可以建议一个更好的方法来进行这个API调用吗?如何发送完成块等。
答案 0 :(得分:0)
将完成块声明为Error?
而不是NSError
,然后您就可以在成功案例中将nil
传递给它。 ?
是使参数可选的原因,这使得它可以包含nil
。 (另外,使用Error
代替NSError
,因为它是惯用的Swift错误类型。)
或者,你可以让你的完成块采用Result
枚举,你可以这样定义:
public enum Result<T> {
case success(T)
case error(Error)
public func unwrap() throws -> T {
switch self {
case let .success(ret):
return ret
case let .error(error):
throw error
}
}
}
然后,您可以使用.success
或.error
个案,具体取决于操作是成功还是失败。
答案 1 :(得分:0)
它不接受nil
,因为您的参数NSError
不是可选的。
声明方法签名,如
func getFlightData(for airportCode: String, minutesBehind:String, minutesAhead:String, completion: (([Flight], NSError?) -> Void)?) {
....
}
它应该可行