[英]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.