首页 文章

Swift异步方法和返回/完成块

提问于
浏览
1

我正在尝试在我的项目中创建一个带有一些输入参数的异步方法 . 如果参数是正确的,那么它将执行一些操作,然后调用完成块 .

但是,如果输入参数不正确,那么它将不会执行这些操作(因此完成块不会运行,我必须自己调用它) .

无论如何,我想知道最好的方法是什么...

我想我可以让方法返回一个包含输入错误的 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(我讨厌那个词,但它描绘了我的意思)?有没有不同的方式我可以完全接近这个?

谢谢

1 回答

  • 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
    }
    

相关问题