这个问题是
Check for object type fails with “is not a type” error在
Check for object type fails with “is not a type” error问题上的启发.
考虑一个空的Swift类:
class MyClass { }
尝试在此类的实例上调用任何NSObjectProtocol方法将导致编译时错误:
let obj = MyClass() obj.isKindOfClass(MyClass.self) // Error: Value of type 'MyClass' has no member 'isKindOfClass'
但是,如果将实例转换为AnyObject,我的对象现在符合NSObjectProtocol,我可以调用由协议定义的实例方法:
let obj: AnyObject = MyClass() obj.isKindOfClass(MyClass.self) // true obj.conformsToProtocol(NSObjectProtocol) // true obj.isKindOfClass(NSObject.self) // false
我的对象不继承NSObject,但仍符合NSObjectProtocol. AnyObject如何符合NSObjectProtocol?
在Cocoa / Objective-C世界中,AnyObject是id.将此对象转换为AnyObject后,可以向其发送任何已知的Objective-C消息,例如isKindOfClass或conformsToProtocol.现在,当你说isKindOfClass或conformsToProtocol时,你不再在Swift世界中;你正在和Objective-C谈Cocoa.所以想想Objective-C如何看待这个对象. Objective-C世界中的所有课程都来自于一些基础类;像MyClass这样的无根类是不可能的.并且Objective-C世界中的每个基类都符合NSObject协议(Swift称之为NSObjectProtocol);这就是基础类(或从)下降的原因!因此,为了让它进入Objective-C世界,Swift将MyClass作为从一个特殊的桥接基类SwiftObject下降,它确实符合NSObjectProtocol(可以在这里看到:
https://github.com/apple/swift/blob/master/stdlib/public/runtime/SwiftObject.mm).