Сравните несколько переменных в одном выражении - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь сравнить несколько переменных с выражением, например, так:

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

Я нашел вопрос, связанный со сравнением переменной с несколькими specific значениями , чтоне то, что я хочу, потому что это не сравнение в неравенстве.

Есть ли способ, которым я могу сократить это каким-либо образом?

Например, сделав неравенство типа 1 <= x && x <= 5 сокращенным,или позволяя мне легко сравнивать x, y и z другими способами?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Другой вариант: сопоставление с набором диапазонов:

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
}

(Сравнить Могу ли я использовать оператор диапазона с оператором if в Swift? .)

0 голосов
/ 24 мая 2018

Может быть так:

if [x,y,z].compactMap{ (1...5).contains($0) }.contains(true) {
    //Do stuff
}
0 голосов
/ 24 мая 2018

Используйте диапазоны!

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) {

}

Как предложил Хэмиш, метод allSatisfy в Swift 4.2может быть реализовано как расширение как это:

extension Sequence {
    func allSatisfy(_ predicate: (Element) throws -> Bool) rethrows -> Bool {
        return try !contains { try !predicate($0) }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...