如何从 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
}
}
在这种情况下如何中止或 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
}
}