Можно ли присвоить функцию переменной в Swift?

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

Ответ

Да, можно. В Swift функции являются объектами первого класса (first-class citizens), что позволяет:

  • Присваивать их переменным и константам
  • Передавать в качестве аргументов другим функциям
  • Возвращать из функций

Примеры:

// 1. Присвоение функции переменной
func multiply(_ a: Int, _ b: Int) -> Int { return a * b }
let mathOperation: (Int, Int) -> Int = multiply
let result = mathOperation(5, 3) // 15

// 2. Массив функций
let operations: [(Int, Int) -> Int] = [
    { $0 + $1 }, // Сложение
    { $0 - $1 }, // Вычитание
    multiply     // Умножение
]

// 3. Опциональный тип функции
var optionalFunction: ((String) -> Void)?
optionalFunction = { print($0) }
optionalFunction?("Hello") // Вызов через optional chaining

Ключевые моменты:

  • Тип переменной должен точно соответствовать сигнатуре функции (параметры и возвращаемый тип).
  • Для методов экземпляра используется связанная функция (bound method), которая захватывает контекст self.
  • Для улучшения читаемости сложных сигнатур используйте typealias.