将多个变量与同一表达式进行比较

时间:2018-05-24 19:25:16

标签: ios swift comparison-operators

我试图将多个变量与表达式进行比较,如下所示:

mv

我找到了question related to comparing a variable to multiple specific values,这不是我想要的,因为它不是不平等的比较。

有什么办法可以用任何方式缩短这个吗?

例如,缩短if 1 <= x && x <= 5 && 1 <= y && y <= 5 && 1 <= z && z <= 5 { // Code to run if true } 之类的不等式,或者让我能够以其他方式轻松比较1 <= x && x <= 5xy

3 个答案:

答案 0 :(得分:2)

使用范围!

if (1...5).contains(x) &&
   (1...5).contains(y) &&
   (1...5).contains(z) {

}

或者,创建一个闭包来检查某些东西是否在范围内:

let inRange: (Int) -> Bool = (1...5).contains
if inRange(x) && inRange(y) && inRange(z) {

}

正如Hamish所建议的那样,Swift 4.2中的allSatisfy方法可以实现为这样的扩展:

extension Sequence {
    func allSatisfy(_ predicate: (Element) throws -> Bool) rethrows -> Bool {
        return try !contains { try !predicate($0) }
    }
}

答案 1 :(得分:2)

另一种选择:匹配范围元组:

if case (1...5, 1...5, 1...5) = (x, y, z) {

}

或使用switch语句匹配一个或多个 范围元组:

switch (x, y, z) {
case (1...5, 1...5, 1...5):
    print("all between 1 and 5")

case (..<0, ..<0, ..<0):
    print("all negative")

default:
    break
}

(比较Can I use the range operator with if statement in Swift?。)

答案 2 :(得分:0)

也许是这样的:

if [x,y,z].compactMap{ (1...5).contains($0) }.contains(true) {
    //Do stuff
}