Any
- это протокол, который может представлять экземпляр любого типа, включая:
var items: [Any] = []
items.append(42) // Int
items.append(3.14159) // Double
items.append("Hello") // String
items.append((1.0, 2.0)) // Кортеж
items.append({ (x: Int) -> Int in x * 2 }) // Функция
Работа с разнородными коллекциями:
func printAll(items: [Any]) {
for item in items {
print(item)
}
}
Бриджинг с Objective-C API (где используется id
)
Динамическое поведение (когда тип неизвестен на этапе компиляции)
AnyObject
- это протокол, который может представлять экземпляр любого класса. Введен для совместимости с Objective-C, где все классы наследуются от NSObject.
class MyClass {}
struct MyStruct {}
let objects: [AnyObject] = [
MyClass(), // OK - класс
NSString("Hello") // OK - класс из Foundation
// MyStruct() // Ошибка - структура
]
Работа с Objective-C API (аналог id
в Objective-C):
func prepareForSegue(_ segue: UIStoryboardSegue, sender: AnyObject?)
Проверка соответствия протоколу (особенно @objc протоколам):
if let delegate = object as? UITableViewDelegate {
// объект соответствует протоколу
}
Слабые ссылки в делегатах:
weak var delegate: AnyObject?
Характеристика | Any | AnyObject |
---|---|---|
Типы | Любые (классы, структуры и др) | Только классы |
Протокол | Да | Да |
Использование | Универсальное | Работа с классами |
Безопасность | Низкая (нужны проверки) | Средняя (только классы) |
Пример | var value: Any = "String" | var object: AnyObject = UIView() |
NotificationCenter.default.addObserver(
forName: .UIApplicationDidBecomeActive,
object: nil,
queue: nil) { (notification: Notification) in
// notification.object имеет тип Any?
}
class Cache {
private var storage: [String: Any] = [:]
func set(_ value: Any, forKey key: String) {
storage[key] = value
}
func get<T>(forKey key: String) -> T? {
return storage[key] as? T
}
}
func checkType(_ value: Any) {
switch value {
case is String:
print("Это строка: \(value as! String)")
case is Int:
print("Это число: \(value as! Int)")
case let object as AnyObject where type(of: object) == MyClass.self:
print("Это экземпляр MyClass")
default:
print("Неизвестный тип")
}
}
Эти типы важны для совместимости и некоторых динамических сценариев, но должны использоваться осознанно из-за потери безопасности типов.