这个问题是
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).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。