AnyObject vs Any vs NSObject vs id — разница
Четыре уровня «что угодно»
Any— любой тип Swift: struct, enum, class, функция,Optional, tuple. Экзистенциальный контейнер; чтобы что-то сделать, нуженas?.AnyObject— любой class-экземпляр (reference-тип). Протокол с class-ограничением; используется дляweak-ссылок на «что-то», для идентичности===, в generic-ограниченияхT: AnyObject. На Apple-платформахAnyObjectумеет@objc-вызовы через optional-синтаксис:obj.perform(...),(obj as AnyObject).description.AnyClass—AnyObject.Type, «любой класс как значение» (метатип):let cls: AnyClass = UIView.self,NSClassFromString.NSObject— конкретный корневой класс Foundation. Даётisa, KVC/KVO,isEqual/hash,description,NSCoding,#selector, совместимость с Cocoa-API. Не путать с протоколомNSObjectProtocol(NSObjectв Obj-C), который описывает тот же контракт дляNSProxyиAnyObject-экзистенциалов.id(Obj-C) — указатель на любой Obj-C-объект. При импорте в Swift —Any, неAnyObject(SE-0116, Swift 3): вidможно положитьString,Int, массив — Swift бриджит их вNSString,NSNumber,NSArrayавтоматически, поэтому единственный честный тип —Any.
import Foundation
final class Box: NSObject {
@objc dynamic var value = 1
}
let anything: [Any] = [1, "two", Box(), { (x: Int) in x }]
let objects: [AnyObject] = [Box(), NSString(string: "s")]
let cls: AnyClass = Box.self
let legacy: Any = NSNumber(value: 3) // так приходит id из Obj-C
func describe(_ v: Any) -> String {
switch v {
case let n as Int: return "Int \(n)"
case let s as String: return "String \(s)"
case let o as NSObject: return "NSObject \(o)"
default: return "other"
}
}
print(describe(legacy)) // Int 3 — NSNumber бриджится в Int
_ = (anything, objects, cls)
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep