swift – AnyObject如何符合NSObjectProtocol?

前端之家收集整理的这篇文章主要介绍了swift – AnyObject如何符合NSObjectProtocol?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题是 Check for object type fails with “is not a type” errorCheck 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).
原文链接:/swift/318740.html

猜你在找的Swift相关文章