Для чего в Swift используется тип AnyObject?

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

Ответ

AnyObject — это протокол, представляющий экземпляр любого класса. Он используется в Swift для типобезопасной работы с объектами, когда конкретный тип класса неизвестен или может быть разным.

Основные сценарии использования:

  1. Совместимость с Objective-C API: Аналог id. Позволяет передавать объекты классов в API, ожидающие нетипизированные ссылки.
  2. Хранение гетерогенных коллекций объектов классов:
    let uiComponents: [AnyObject] = [UIButton(), UILabel(), UIImageView()]
  3. Проверка типа и приведение (type casting):
    for object in uiComponents {
        if let button = object as? UIButton {
            button.setTitle("Tap", for: .normal)
        }
    }
  4. Определение протоколов только для классов (class-only protocols):
    protocol MyDelegate: AnyObject { // Делегат должен быть классом
        func didUpdate()
    }

Важное отличие от Any:

  • AnyObject ограничен только классами.
  • Any может представлять экземпляр любого типа, включая структуры, перечисления, функции и классы.
let mixedArray: [Any] = ["String", 42, UIView()] // Допустимо
let classArray: [AnyObject] = [UIView(), NSObject()] // Только классы
// let errorArray: [AnyObject] = ["String", 42] // Ошибка: String и Int - структуры