Ответ
В Swift функция первого класса — это функция, которую можно:
- Присвоить переменной или константе.
- Передать в качестве аргумента другой функции.
- Вернуть как результат из функции.
Это свойство делает функции и замыкания полноправными типами данных, что является основой функционального программирования.
Примеры:
// 1. Присвоение функции переменной
let sayHello = { print("Hello!") }
sayHello() // Вывод: Hello!
// 2. Передача функции как аргумента
func execute(times: Int, task: () -> Void) {
for _ in 0..<times { task() }
}
execute(times: 3, task: sayHello)
// Вывод:
// Hello!
// Hello!
// Hello!
// 3. Возврат функции из функции
func multiplier(for factor: Int) -> (Int) -> Int {
return { number in
return number * factor
}
}
let double = multiplier(for: 2)
print(double(7)) // Вывод: 14
Практическое значение: Это позволяет создавать гибкие абстракции, такие как обработчики завершения (completion handlers), функции высшего порядка (map, filter, reduce) и конфигурируемое поведение.
Ответ 18+ 🔞
А, слушай, смотри, это же простая хуйня, но мозги иногда выносит, если не понять сразу. Функция первого класса в Swift — это не какая-то заумная херня, а просто функция, с которой можно делать всё то же самое, что и с обычной переменной, типа числа или строки. То есть её можно, блядь:
- Запихнуть в переменную или константу, как какой-нибудь
Int. - Швырнуть как аргумент в другую функцию, будто бы это бутерброд в рот.
- Выдать на-гора как результат из функции, типа «на, держи свою функцию, распидорасил».
Это, сука, и есть та самая основа, на которой строится всё это функциональное программирование, где функции — полноправные граждане, а не парии какие-то.
Смотри, как это выглядит на практике, ёпта:
// 1. Сунул функцию в переменную — и всё, она там живёт.
let sayHello = { print("Hello!") }
sayHello() // Выведет: Hello! Ну, очевидно же.
// 2. Запилил одну функцию, а внутрь неё — другую функцию в качестве аргумента, как начинку в пирог.
func execute(times: Int, task: () -> Void) {
for _ in 0..<times { task() }
}
execute(times: 3, task: sayHello)
// Выведет три раза "Hello!", потому что мы так сказали. Вообще, доверия ебать ноль к таким циклам.
// 3. А вот это уже поинтереснее: функция, которая плодит и возвращает другие функции. Ёперный театр!
func multiplier(for factor: Int) -> (Int) -> Int {
return { number in
return number * factor
}
}
let double = multiplier(for: 2) // Получил функцию-удвоитель.
print(double(7)) // Вывод: 14. Математика, блядь, работает!
А нахуя это всё? А вот нахуя: это позволяет делать гибкие штуки. Все эти обработчики завершения, которые вечно висят в асинхронщине, или эти вездесущие map, filter, reduce — они все на этом принципе работают. Можно конфигурировать поведение на лету, не выёбываясь с кучей классов. В общем, мощная хуйня, если руки из правильного места.