[英]Swift async method and return / completion block
我正在嘗試在我的項目中創建一個使用一些輸入參數的異步方法。 如果參數正確,它將執行一些操作,然后調用完成塊。
但是,如果輸入參數不正確,則它將不會執行任何操作(因此,完成代碼塊將無法運行,因此我必須自己調用它)。
無論如何,我想知道最好的方法是什么...
我在想我可以讓該方法返回一個Status
枚舉,該枚舉包含輸入的錯誤,然后還包含完成塊。
問題在於完成塊也可能有錯誤。 因此,也許應該是其他錯誤類型?
諸如此類...(以登錄為例)。
enum LoginRequestStatus {
case missingEmail
case missingPassword
case requestingLogin
}
然后來自完成的錯誤可能是...
enum LoginError: Error {
case noUserFound
case invalidPassword
case success
}
然后函數可能看起來像這樣...
func login(withEmail email: String, password: String, completion: (LoginError?) -> ()) -> LoginStatus {
if email.isEmpty() {
return LoginStatus.missingEmail
}
if password.isEmpty() {
return LoginStatus.missingPassword
}
//make some async request here or something...
//... if error...
completion(LoginError.invalidPassword)
return LoginStatus.requestingLogin
}
那有意義嗎? 那是Swifty嗎(我討厭這個詞,但刻畫了我的意思)? 我可以完全采用其他方法嗎?
謝謝
在我看來,可以使用throws
來簡化與方法的交互。 我寫一個小例子。 通過這種實現,很容易不會因為exceptions
而錯過錯誤。 如果請求成功,將顯示清晰的響應狀態。
引發錯誤:
enum LoginError: ErrorType {
case missingEmail
case missingPassword
}
回應狀態:
enum LoginRequestStatus {
case noUserFound
case invalidPassword
case success
}
功能實現:
func login(withEmail email: String, password: String) throws -> LoginRequestStatus {
guard email.characters.count > 0 else{
throw LoginError.missingEmail
}
guard password.characters.count > 0 else{
throw LoginError.missingPassword
}
// do some request
return LoginRequestStatus.success
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.