Что такое функция первого класса в Swift?

Ответ

В 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 — они все на этом принципе работают. Можно конфигурировать поведение на лету, не выёбываясь с кучей классов. В общем, мощная хуйня, если руки из правильного места.