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

Compare multiple variables to the same expression

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

if 1 <= x && x <= 5 &&
    1 <= y && y <= 5 &&
    1 <= z && z <= 5 {
    // Code to run if true
}

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

有什么办法可以缩短它吗?

例如缩短 1 <= x && x <= 5 这样的不等式,或者让我能够以其他方式轻松比较 xyz

使用范围!

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([=12=]) }
    }
}

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

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?。)

可能是这样的:

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