Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了swift – 如何列出对象符合的协议?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

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

let obj = NSObject()

var pc: UInt32 = 0
let 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 = 0

let 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 – 如何列出对象符合的协议?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: