我在这里有一个代码片段,但是如果有一个 clean 方法来完成同样的事情,我很好奇。到目前为止,我还没有看到任何完全相同的东西。
逻辑我想要实现
error
为nil
或不是SpecialError
error
为non-nil
但 .foo()
返回false
代码
enum SpecialError: Error {
func foo() -> Bool
}
let error: Error? // Some optional Error is passed in
if let myError = error as? SpecialError, myError.foo() {
// Don't care about this case
} else {
// This is the case I'm interested in
bar()
}
我很好奇是否有更好的方法来实现这个if let else
逻辑。
答案 0 :(得分:3)
我可能会误解,但似乎在if
声明的第一个分支中没有发生任何事情,你想把它缩减到第二部分?在这种情况下,这应该适合你:
if !((error as? SpecialError)?.foo() ?? false) {
bar()
}
如果出现以下情况,则执行bar()
:
1. error
是零
2. error
不是SpecialError
3. foo()
返回false
答案 1 :(得分:2)
你想要的条件是当表达式(error as? SpecialError)?.foo()
评估为:
nil
,在这种情况下,error
不是SpecialError
,或者是nil
。false
,在这种情况下error
是SpecialError
,但foo()
返回false
。在你的情况下,表达这一点的一种方法是利用等于运算符为选项重载的事实,并说:
if (error as? SpecialError)?.foo() != true {
bar()
}
由于我们使用比较可选项的!=
重叠,true
将被提升为Bool?
,因此我们检查(error as? SpecialError)?.foo()
是不是.some(true)
,在这种情况下相当于检查.some(false)
或.none
。
答案 2 :(得分:1)
如果我理解你的问题,你可能正在寻找类似的东西:
if !((error as? SpecialError)?.foo() ?? false) {
答案 3 :(得分:1)
如你所解释的那样完全翻译它:
Trend.Line <- numeric(0)
start <- -5
end <- 12
m <- 345.72
b <- 54454
for(i in start:end){
y <- m*(i) + b
Trend.Line[i] <- y
}
Trend.Line
或的短路将阻止{em>强行解除 if error == nil || !(error! is SpecialError) || !error!.foo() {
bar()
}
成为问题。
答案 4 :(得分:0)
我认为你的代码难以阅读,John Montgomery的代码更难以阅读,我预测它很难维护:想象一下另一个开发人员在一年后查看这段代码并询问你它在做什么,或者更糟糕的是,开发人员不能问你,因为你不再可用。想象一下,即使在几个月后,你也会看到这段代码。
if let myError = error as? SpecialError, myError.foo()
令人费解,也许有点过于聪明。它包含太多逻辑,无法由开发人员团队长期阅读。
您的第一个块可以检查 myError是否为
你的第二个块可以检查是否是类型为SpecialError的错误
//you could use a guard statement here
if myError == nil {
return;
}
if let myError = error as? SpecialError {
//ok myError is type SpecialError it has a foo method I can call
if(myError.foo()) {
//do something
} else {
//do something else
}
} else { //myError not type SpecialError and is not nil
// This is the case I'm interested in
bar()
}
答案 5 :(得分:0)
if let theFoo = (error as? SpecialError)?.foo(){
if theFoo != true{
bar()
} //in case you want to do handling if theFoo is true
} //in case you want to do handling if error is not SpecialError