swift – 如何列出对象符合的协议?

swift – 如何列出对象符合的协议?,第1张

概述使用Objective-C运行时,我可以获得一个对象符合的所有@objc协议的列表: let obj = NSObject()var pc: UInt32 = 0let plist = class_copyProtocolList(object_getClass(obj), &pc)print("\(obj.dynamicType) conforms to \(pc) protocols 使用Objective-C运行时,我可以获得一个对象符合的所有@objc协议的列表:

let obj = NSObject()var pc: UInt32 = 0let pList = class_copyProtocolList(object_getClass(obj),&pc)print("\(obj.dynamicType) conforms to \(pc) protocols")for i in 0 ..< Int(pc) {    print(String(format: "Protocol #%d: %s",arguments: [i,protocol_getname(pList[i])]))}

或者运行时加载的所有Objective-C协议:

var allProtocolCount: UInt32 = 0let protocols = objc_copyProtocolList(&allProtocolCount)print("\(allProtocolCount) total protocols")for i in 0 ..< Int(allProtocolCount) {    print(String(format: "Protocol #%d: %s",protocol_getname(protocols[i])]))}

但这些都没有列出任何Swift协议:

func == (lhs: MyClass,rhs: MyClass) -> Bool {    return lhs.value == rhs.value}class MyClass: Equatable,Hashable {    var value: Int    var hashValue: Int {        return value    }    init(value: Int) {        self.value = value    }}var count: UInt32 = 0;let strProtocols = class_copyProtocolList(MyClass.self,&count) // 0x0000000000000000

strProtocols是0,当我希望它返回sizeof(协议)* 2(因为MyClass符合Equatable和Hashable).

是否有运行时公开的接口来获取对象符合的协议列表?

解决方法 你不能.不是ObjC的Swift协议只存在于编译时,并且实际上并不存在于对象本身上(这就是为什么根据变量的类型静态调度它们的方法的原因). 总结

以上是内存溢出为你收集整理的swift – 如何列出对象符合的协议?全部内容,希望文章能够帮你解决swift – 如何列出对象符合的协议?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1018711.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存