Чтобы расширить уже существующие ответы, функции обеспечивают высокую степень повторного использования, а для вашего конкретного примера могут работать функции высокого порядка.
Начнем с определения основных блоков для сравнения данных. операции, которые вы хотите выполнить:
/// Creates a function that acts as a comparator against the received value
func isGreater<T: Comparable>(than value: T) -> (T) -> Bool {
return { $0 > value }
}
/// Creates a function that checks if the argument in betwen the two bounds
func isWithin<T: Comparable>(_ lower: T, and upper: T) -> (T) -> Bool {
return { lower..<upper ~= $0 }
}
/// Creates a function that checks if an array contains elements that satisfy the given predicate
func contains<T>(_ predicate: @escaping (T) -> Bool) -> ([T]) -> Bool {
return { $0.contains(where: predicate) }
}
Обе вышеперечисленные функции создают и возвращают новую функцию, которую можно сохранить и использовать в любом месте вашего приложения.
Теперь давайте разместим функциидля хорошего использования:
func hasAboveThreshold(threshold: Double) -> ([Double]) -> Bool {
return contains(isGreater(than: threshold))
}
func hasBetweenThreshold(threshold1: Double, threshold2: Double) -> ([Double]) -> Bool {
return contains(isWithin(threshold1, and: threshold2))
}
Обратите внимание, как каждый фрагмент (функция) из первого фрагмента кода был повторно использован посредством композиции функций. Таким образом, вы достигаете цели повторного использования.
Пример использования:
let numbers = [1.1, 2.2, 3.3, 4.4, 5.5]
let hasBetween1AndTen = hasBetweenThreshold(threshold1: 1.0, threshold2: 10.0)
print(hasBetween1AndTen(numbers))
Когда вы сохраняете hasBetween1AndTen
в переменной, вы можете использовать ее в любое время и в любом месте, гдеимеет доступ к этой переменной.