假设我有两个变量,两个选项:
var a:Int? = 42
var b:Int? = 13
我有条件可以继续进行,只要这些目前都不是。我不假思索地把这样的东西放在一起:
guard let _ = a, let _ = b else { return }
我心不在焉地认为条件是OR,而不是AND。显然那是错的。那么问题就变成了,是否有一种惯用/首选方式来测试它?或者我只是回归基础:
if a == nil && b == nil { return }
除了
如果我使用this post添加的邮件扩展名,那么我可能会高兴地写一些类似
的内容guard a.notNil || b.notNil else { return }
这是关闭的,因为我可以来"确定(警卫)a不是n或b不是nil"
答案 0 :(得分:3)
guard
实际上是if
,所以你可以用同样的方式做到这一点。这很清楚,使用后卫,这似乎是乐趣的一部分。我提供了OR和AND选项,因此您可以选择一个。
func doItOr(a: Int?, b:Int?) {
guard (a != nil || b != nil) else { return }
print("either A and B is not nil");
}
func doItAnd(a: Int?, b:Int?) {
guard (a != nil && b != nil) else { return }
print("both A and B are not nil");
}
doItOr(nil, b: nil)
doItOr(nil, b: 5)
doItOr(4, b: 5) // prints
doItAnd(nil, b: nil)
doItAnd(nil, b: 5)
doItAnd(nil, b: nil)
doItAnd(4, b: 5) // prints
答案 1 :(得分:1)
只要这些目前不是nil
,就可以继续了
你的问题提出了两个完全不同的可能条件,所以为了讨论的目的,我会假设你的意思是这个,即"当前不是两个"。好的,那么:"不是"是!
。 "这两种"是&&
。所以,像这样:
guard !(a == nil && b == nil) else {return}
答案 2 :(得分:0)
如果你真的不需要将a
或b
绑定为非选项或辨别哪两个是非零,我相信惯用的方法仍然是使用if语句。
我通常使用guard
通过绑定选项,向下转换等来缩小参数的特异性。
你似乎没有兴趣在这里这样做。你只想检查它们,所以if
似乎恰当地表达了它。