Можно ли хранить замыкание как свойство класса в Swift?

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

Ответ

Да. Замыкания являются ссылочными типами и могут быть присвоены свойствам класса или структуры.

Ключевой аспект — управление памятью. Если замыкание захватывает self, необходимо предотвратить сильные циклические ссылки (retain cycles).

Пример безопасной реализации:

class MyClass {
    var closure: (() -> Void)?

    init() {
        // Используем weak capture, чтобы избежать retain cycle
        closure = { [weak self] in
            self?.doSomething()
        }
    }

    private func doSomething() {
        print("Action performed")
    }
}

Рекомендации:

  • Всегда используйте [weak self] или [unowned self], если замыкание, хранимое как свойство, захватывает self.
  • Тип свойства должен соответствовать сигнатуре замыкания (например, (() -> Void)?).