Ответ
Да, можно. В Swift замыкания (closures) являются first-class типами, что позволяет присваивать их переменным, передавать как аргументы и хранить в коллекциях, включая массивы.
Базовый пример:
// Массив замыканий, не принимающих и не возвращающих значений
var handlers: [() -> Void] = []
let handler1 = { print("Task 1 completed") }
let handler2 = { print("Task 2 completed") }
handlers.append(handler1)
handlers.append(handler2)
// Выполнить все замыкания
handlers.forEach { $0() }
// Вывод:
// Task 1 completed
// Task 2 completed
Практическое применение:
- Цепочки обратных вызовов (callback chains)
- Массивы обработчиков событий (например, кнопка с несколькими действиями)
- Отложенное выполнение задач
Критически важные нюансы:
- Явное указание типа: Компилятору часто требуется явная аннотация типа массива.
-
Циклы сильных ссылок: Если замыкание захватывает
self, это создаёт сильную ссылку.// ❌ Риск утечки памяти closures.append { self.doSomething() } // ✅ Безопасный захват closures.append { [weak self] in self?.doSomething() } - Изменяемость: Если массив объявлен как
let, вы не сможете добавлять или удалять замыкания.