Предположим, вы часто хотите проверить номер, i
, является кратным другому значению. Что может быть несколько из может измениться, но правило для определения его всегда одно и то же: i % n == 0
.
Вы могли бы написать такую функцию:
func isMultipleOf(#n: Int, #i: Int) -> Bool {
return i % n == 0
}
isMultipleOf(n: 2, i: 3) // false
isMultipleOf(n: 2, i: 4) // true
Однако, возможно, вы оказываетесь часто хотят использовать эту функцию с другими функциями «высокого порядка» - то есть, функции, которые принимают другие функции в качестве аргументов , такие как map
и filter
:
let r = 1...10
// use isMultipleOf to filter out the even numbers
let evens = filter(r) { isMultipleOf(n: 2, i: $0) }
// evens is now [2,4,6,8,10]
Это использование isMultipleOf
выглядит немного неуклюжим и трудно читать, поэтому, возможно, вы определить новую функцию, isEven
, с точки зрения isMultipleOf
, чтобы сделать его немного яснее:
let isEven = { isMultipleOf(n: 2, i: $0) }
isEven(2) // true
isEven(3) // false
let evens = filter(r, isEven)
Теперь предположим, что вы объявляете isMultipleOf
немного по-другому, как выделанной функции:
func isMultipleOf(#n: Int)(#i: Int) -> Bool {
return i % n == 0
}
isMultipleOf
теперь функция, которая принимает число, n
и возвращает новую функцию, которая принимает число и проверяет, является ли она кратной n
.
Теперь вы можете использовать его, чтобы объявить isEven
как это:
let isEven = isMultipleOf(n: 2)
Или вы можете использовать его непосредственно с фильтром, как это:
let evens = filter(r, isMultipleOf(n: 2))
// just like before, evens is [2,4,6,8,10]
Наиболее часто используется для повторного запроса контейнер некоторых Сортировать. Примените функцию поиска к контейнеру, назовите это значение, и вы сможете повторно применять его немного дешевле. –