加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – AnyObject如何符合NSObjectProtocol?

发布时间:2020-12-14 05:40:45 所属栏目:百科 来源:网络整理
导读:这个问题是 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方法将导致编译时
这个问题是 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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读