В чем разница между типами Any и AnyObject в Swift?

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

Ответ

Any может представлять экземпляр любого типа, включая структуры (struct), перечисления (enum), классы (class), функции и замыкания. AnyObject может представлять только экземпляр любого класса (или протокола с атрибутом @objc).

Пример:

let anyValue: Any = 42 // Int (структура)
let anyObjectValue: AnyObject = NSString("Hello") // NSString (класс)
// anyObjectValue = 42 // Ошибка компиляции: Int не является классом

Ключевые отличия:

  • Область применения: Any универсален, AnyObject ограничен классами.
  • Цель: AnyObject в основном используется для совместимости с Objective-C API и для хранения коллекций объектов с общим классом-предком.
  • Безопасность типов: Оба стирают информацию о типе. Для проверки и приведения используйте операторы is, as? и as!.
  • Производительность: Работа с Any/AnyObject может быть менее эффективной из-за необходимости динамической диспетчеризации.