如何从 switch-case 语句中 return 一个函数

How to return a function from inside a switch-case statement

在这种情况下如何中止或 return 父函数:

enum MyError: String, Error {
case serverError = "This is a server error"
case condition1NotTrue = "Condition 1 is not true"
}

func myServerFunction(finishesSuccessful:Bool, completionHandler: @escaping (Result<Void, MyError>) -> Void) {
    if finishesSuccessful {
        completionHandler(.success(()))
    } else {
        completionHandler(.failure(.serverError))
    }
}

func myMainFunction(test1:Bool, uploadToServer:Bool, completionHandler: @escaping (Result<Void,MyError>) -> Void) {
    // check that condition test1 is true
    if !test1 {
        completionHandler(.failure(.condition1NotTrue))
        return // abort function to not execute the rest
    }
 
    if uploadToServer {
        myServerFunction(finishesSuccessful: false) { result in
            switch result {
            case .success():
                print("Successfully uploaded to server")
            case .failure(let error):
                print("Error uploading to server: \(error.rawValue)")
                completionHandler(.failure(error))
                return // <<<--- Here is my problem
            }
        }
    }

    // if !test1 && upload to server successful -> continue and update local data
    print("Local data will be updated now...")
}

myMainFunction(test1: true, uploadToServer: true) { result in
    switch result {
    case .success():
        print("myMainFunction succeeded")
    case .failure(let error):
        print("myMainFunction failed: \(error.rawValue)")
     }
}

基本上我想做的是检查一些数据,然后决定是否应该将其上传到服务器。如果不是,它将仅在本地使用,但如果需要上传,我必须确保成功。否则我不想更新我的本地数据。

这输出

Error uploading to server: This is a server error myMainFunction failed: This is a server error Local data will be updated now...

如果 test1 不正确,return 取消 myMainFunction 工作正常,它不会更新本地数据。 return 以防 myServerFunction 失败,因为它只会停止 switch-case-statement。

有没有直接从那里 return myMainFunction 的方便方法?我能想到的唯一解决方法是在 switch 语句中设置一个 bool,然后在 switch 语句之后调用 return,但它看起来有点奇怪。

根据@JoakimDanielson 的建议,我将 myServerFunction 更改为抛出而不是使完成处理程序失败:

func myServerFunction(finishesSuccessful:Bool) throws {
    if finishesSuccessful {
        print("Upload to Server successful")
    } else {
        throw MyError.serverError
    }
}

现在我可以在 myMainFunction 中捕获错误

if uploadToServer {
    do {
        try myServerFunction(finishesSuccessful: false)
    } catch {
        completionHandler(.failure(.serverError))
        return
    }
}