В чем разница между функцией и замыканием в Swift?

«В чем разница между функцией и замыканием в Swift?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Swift функция — это частный случай замыкания. Замыкание — более общая концепция.

Функция: Именованное, самостоятельное замыкание, объявленное с помощью ключевого слова func.

// Именованная функция
func greet(name: String) -> String {
    return "Hello, (name)!"
}

Замыкание (Closure): Анонимный блок кода, который может захватывать и хранить ссылки на переменные и константы из окружающего контекста.

// Замыкание (анонимная функция)
let greetClosure = { (name: String) -> String in
    return "Hello, (name)!"
}

Ключевые особенности замыканий:

  1. Захват контекста (Capture): Замыкание может захватывать и хранить ссылки на переменные из окружающей области видимости, даже если эта область уже прекратила существование.

    func makeIncrementer(incrementAmount: Int) -> () -> Int {
        var total = 0
        // Замыкание захватывает переменные `total` и `incrementAmount`
        let incrementer: () -> Int = {
            total += incrementAmount
            return total
        }
        return incrementer
    }
  2. Синтаксический сахар: Swift предоставляет упрощенный синтаксис для замыканий (trailing closures, shorthand argument names $0, $1).

    let numbers = [1, 2, 3]
    let doubled = numbers.map { $0 * 2 } // Trailing closure с shorthand argument
    // doubled = [2, 4, 6]

Итог: Все функции в Swift являются замыканиями, но не все замыкания являются именованными функциями. Замыкания — это фундаментальные строительные блоки для асинхронного кода, колбэков и функциональных преобразований (map, filter, reduce).