Передать условный аргумент в Swift? - PullRequest
0 голосов
/ 10 января 2019

Я думал об абстрактной условной логике в моем приложении. Предположим, у меня есть две функции в этом упрощенном примере:

func1(val1: Int, val2: Int, threshold: Int) -> Bool {
  return (val1 == threshold && val2 == threshold)
}

func2(val: Int, thresholdHi: Int, thresholdLo: Int) {
  return (val < thresholdHi && val > thresholdLo)
}

Моя идея состоит в том, чтобы создать функцию, которая выполняет условную проверку набора значений.

funcIdea(vals[Int], conditional: ???) -> Bool {
  for val in vals {
    if !conditional(val) { return false; }
  }
  return true
}
func1(...){
  return funcIdea([val1, val2], ???)
}

Я думаю, что это возможно либо с помощью замыкания, либо с помощью функции.

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Вам нужно передать замыкание в вашу функцию, затем вы можете использовать contains(where:), чтобы проверить, является ли замыкание истинным для всех элементов массива. Двойное отрицание необходимо для раннего выхода из contains(where:).

extension Array {
    func allElementsSatisfy(_ condition: (Element)->(Bool)) -> Bool {
        return !self.contains(where: { !condition($0)})
    }
}

Тогда вы можете просто вызвать его на любом массиве следующим образом:

[1,2,3].allElementsSatisfy({$0 < 1}) // false
[1,2,3].allElementsSatisfy({$0 < 4}) // true
["a","b","c"].allElementsSatisfy({$0.count == 1}) // true
["a","b","c"].allElementsSatisfy({$0.count > 1}) // false
0 голосов
/ 10 января 2019

Возможно с закрытием.

func funcIdea(vals: [Int], conditional: (Int)->Bool) -> Bool {
    for val in vals {
        if !conditional(val) { return false; }
    }
    return true
}

func func1(val1: Int, val2: Int, threshold: Int) -> Bool {
    //return (val1 == threshold && val2 == threshold)
    return funcIdea(vals: [val1, val2], conditional: { (val) -> Bool in
        return val > threshold
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...