我想弄清楚如何让Swift推断出下面代码片段中guard case
的else
子句中唯一可能的值是.failure
,这是可能的,或者可能有其他方法可以采用?
enum MyError {
case error
}
func create() {
let result = createResult(...) // -> Result<Data, MyError>
guard case let .success(resultData) = result else {
// maybe somehow get the else case of guard stored in a variable in here, but how???
switch result {
case .failure(.error):
self.isError = true
return
}
// getting "Switch must be exhaustive" error even though .success is not possible and there is only one .error case in the error enum
}
// success code here...
}
我尝试使用来自@HangarRash的answer的常规switch
,它工作正常,但我想避免函数成功部分的嵌套。
2条答案
按热度按时间eh57zj3b1#
即使嵌套的数量是可以忍受的,我仍然想知道是否有可能做到这一点没有嵌套。
嗯,如果你做一个扩展,大多数事情都是可能的:)
然后:
这看起来相当丑陋,虽然说实话,但确实,它不巢成功的分支。
我建议将其转换为使用常规的
try...catch
错误处理,方法是在Result
上调用get
。(If您可以更改
createResult
函数,只需将其更改为throws
即可。)如果您以相同的方式处理所有错误,则可以轻松地将其扩展到多个
Result
:但是,这样做的缺点是,如果多个
Result
具有相同的故障类型,则您将不知道错误来自catch
块中的何处,这意味着您无法以不同的方式处理这些结果。tcbh2hod2#
由于您需要处理这两种可能的情况,因此
guard
没有任何意义,只需在switch
中填写这两种情况,并在.success
中处理成功代码即可。简单得多,也更有条理。如果“成功”代码又长又复杂,那么就把它放在一个单独的函数中。类似这样:
如果您想保留
guard
,可以将switch
替换为if case let
,因为此时您只需要处理.failure
情况: