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

时间:2016-03-24 14:59:26

标签: swift protocols objective-c-runtime swift-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", arguments: [i, 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时,

sizeof(Protocol) * 2为0(因为MyClass符合EquatableHashable)。

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

1 个答案:

答案 0 :(得分:5)

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