如何在函数中抛出一个闭包?
How to throw inside a closure in a function?
我正在重构我的代码以使一切更清晰。我向我的 API 发出请求,并期望返回不同类型的值,因此我创建了一个通用函数来简化我的代码。
我想让这个函数抛出,这样我就可以简单地使用 do catch
来处理不同类型的错误或成功案例。
这是我的功能:
func performRequest<T: Codable>(_ request: URLRequest, ofType: T.Type) throws -> T{
URLSession.shared.dataTask(with: request) {(data, response, err) in
if let err = err {throw err}
if let response = response as? HTTPURLResponse {
if response.statusCode != 200 {
// Here I would return the value
} else {
// here I would throw the error
}
}
}.resume()
}
但是在 URLSession.shared.dataTask
之后的第一行我得到了这个错误:
Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type '(Data?, URLResponse?, Error?) -> Void'
我知道那是因为我试图放入 dataTask 函数,但我的问题是,有什么方法可以实现吗?
你的调用是异步的。收到数据后,您需要 return 闭包内的数据。要检查调用是否成功,您可以使用新引入的 Result
类型,因此您不需要 throw
func performRequest<T: Codable>(_ request: URLRequest, completion: @escaping (Result<T, Error>) -> Void) {
URLSession.shared.dataTask(with: request) { (data, response, err) in
if let err = err {
return completion(Result.failure(err))
}
if let response = response as? HTTPURLResponse {
if response.statusCode == 200 { // 200 is code for OK btw
return completion(Result.success(someValueOfTypeT))
} else {
return completion(Result.failure(yourError))
}
}
}.resume()
}
用法:(注意 T
的类型可以从闭包声明中推断出来)
performRequest(someRequest) { (result: Result<SomeTypeConformsToCodable, Error>) in
switch result {
case .success(let value):
// work with value
case .failure(let err):
print(err)
}
}
我正在重构我的代码以使一切更清晰。我向我的 API 发出请求,并期望返回不同类型的值,因此我创建了一个通用函数来简化我的代码。
我想让这个函数抛出,这样我就可以简单地使用 do catch
来处理不同类型的错误或成功案例。
这是我的功能:
func performRequest<T: Codable>(_ request: URLRequest, ofType: T.Type) throws -> T{
URLSession.shared.dataTask(with: request) {(data, response, err) in
if let err = err {throw err}
if let response = response as? HTTPURLResponse {
if response.statusCode != 200 {
// Here I would return the value
} else {
// here I would throw the error
}
}
}.resume()
}
但是在 URLSession.shared.dataTask
之后的第一行我得到了这个错误:
Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type '(Data?, URLResponse?, Error?) -> Void'
我知道那是因为我试图放入 dataTask 函数,但我的问题是,有什么方法可以实现吗?
你的调用是异步的。收到数据后,您需要 return 闭包内的数据。要检查调用是否成功,您可以使用新引入的 Result
类型,因此您不需要 throw
func performRequest<T: Codable>(_ request: URLRequest, completion: @escaping (Result<T, Error>) -> Void) {
URLSession.shared.dataTask(with: request) { (data, response, err) in
if let err = err {
return completion(Result.failure(err))
}
if let response = response as? HTTPURLResponse {
if response.statusCode == 200 { // 200 is code for OK btw
return completion(Result.success(someValueOfTypeT))
} else {
return completion(Result.failure(yourError))
}
}
}.resume()
}
用法:(注意 T
的类型可以从闭包声明中推断出来)
performRequest(someRequest) { (result: Result<SomeTypeConformsToCodable, Error>) in
switch result {
case .success(let value):
// work with value
case .failure(let err):
print(err)
}
}