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 – 如何列出对象符合的协议?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)