我正在撰寫一個帶有錯誤處理功能的閉包,但我收到一條警告“'catch' 塊無法訪問,因為在 catch 行的 'do' 塊中沒有拋出任何錯誤”。這是我的代碼:
class Service {
func graphQL(body: [String:Any], onSuccess: @escaping (Foundation.Data) -> (), onFailure: @escaping (Error) -> ()) {
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
onFailure(error)
}
if let data = data {
do{
onSuccess(data)
}
catch{
onFailure(error)
}
}
}.resume()
}
class TimeDepositManager {
func getTimeDeposits(onSuccess: @escaping ([TimeDeposits]) -> (), onFailure: @escaping (Error) -> ()) {
let body = ["query": "{ account { timeDeposits { returnAmount interestRate dueDate originalAmount id startDate currency } } }"
]
Service().graphQL(body: body, onSuccess: { data in
let json = try? JSONDecoder().decode(GraphQLResponse.self, from: data)
onSuccess(json?.data?.account?.timeDeposits ?? [])
}, onFailure: { error in
print(error)
})
}
我想要 func getTimeDeposits() 中的 onSuccess 邏輯,但是如何洗掉這個 catch 塊警告?
uj5u.com熱心網友回復:
Swift 在錯誤處理方面需要一些“期望”。
也就是說,success需要宣告它可以throw是一個錯誤(根據我對你的要求的理解),例如
func graphQL(body: [String:Any], onSuccess: @escaping (Foundation.Data) throws -> (), onFailure: @escaping (Error) -> ()) {
然后你需要try打電話success...
do{
try onSuccess(data)
}
catch{
onFailure(error)
}
uj5u.com熱心網友回復:
如何洗掉這個 catch 塊警告?
通過去除的do-catch完全塊,因為沒有什么哪throws
代替
URLSession.shared.dataTask(with: request) { (data, response, error) in
if let error = error {
onFailure(error)
}
if let data = data {
do{
onSuccess(data)
}
catch{
onFailure(error)
}
}
}.resume()
和
URLSession.shared.dataTask(with: request) { (data, _, error) in
if let error = error {
onFailure(error)
} else {
onSuccess(data!)
}
}.resume()
旁注:而不是非常繁瑣和過時
onSuccess: @escaping (Foundation.Data) -> (), onFailure: @escaping (Error) -> ())
考慮使用Result型別
completion: @escaping (Result<Data,Error>) -> Void)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367367.html
