Причина использования функции в качестве аргумента состоит в том, что она делает вашу функцию более гибкой. Это позволяет вызывающей стороне решить, что делает plus
, передав функцию или замыкание, которое объединяет два значения Int
для возврата значения Int
.
Например, предположим, что вызывающая сторона хочет, чтобы plus
умножил значения:
print(averageArg(*, 5, 6))
15
или взять max
из двух значений (передав закрытие):
print(averageArg({ max($0, $1) }, 1, 100))
50
Лучшим примером этого является функция Swift sorted(by:)
. sorted
принимает закрытие, которое определяет, что означает areInIncreasingOrder
. Это позволяет сортировать массив по возрастанию и убыванию, просто изменив переданную функцию:
[1, 3, 2, 4].sorted(by: <)
[1, 2, 3, 4]
[1, 3, 2, 4].sorted(by: >)
[4, 3, 2, 1]
Вот пример использования функции:
func shortNamesFirst(_ name1: String, _ name2: String) -> Bool {
if name1.count < name2.count {
return true
} else if name1.count > name2.count {
return false
} else {
// when names are the same length, sort
// them alphabetically
return name1 < name2
}
}
["Chuck", "Bob", "Bill", "Jo", "Ed", "Alexander"].sorted(by: shortNamesFirst)
["Ed", "Jo", "Bob", "Bill", "Chuck", "Alexander"]
Автор sorted
не обязан предоставлять другую версию sorted
для каждого типа заказа, который может пожелать пользователь. Пользователь может решить, что для него значит sorted
.