我正在尝试在我的项目中创建一个带有一些输入参数的异步方法。如果参数是正确的,那么它将执行一些操作,然后调用完成块。
但是,如果输入参数不正确,那么它将不会执行这些操作(因此完成块不会运行,我必须自己调用它)。
无论如何,我想知道最好的方法是什么......
我想我可以让方法返回一个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(我讨厌这个词,但它描绘了我的意思)?有没有不同的方式我可以完全接近这个?
由于
答案 0 :(得分:2)
从我的观点来看,可以使用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
}