【问题标题】:How do I list the Protocols an Object Conforms to?如何列出对象符合的协议?
【发布时间】:2016-03-24 14:59:25
【问题描述】:

使用 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 是 0,而我希望它返回 sizeof(Protocol) * 2(因为 MyClass 符合 EquatableHashable)。

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

【问题讨论】:

    标签: swift protocols objective-c-runtime swift-protocols


    【解决方案1】:

    你不能。不是 ObjC 的 Swift 协议只存在于编译时,并不真正存在于对象本身上(这就是为什么它们的方法是根据变量的类型静态分派的)。

    【讨论】:

    • 对不起我的粗鲁,但这个答案是沙拉。编译器知道。
    • 重点是,虽然编译器知道运行时不知道,但编译后的二进制文件中不会捕获信息,因此您无法询问特定对象以获取信息。我没有关注最近关于反思的事态发展,所以在过去的 18 个月里,其中一些可能已经发生了变化。
    • 干杯。您的评论将是一个很好的答案:) 我将您的原始答案误解为“swift 不保留协议一致性数据库”,鉴于 Swift 的编译时检查,这没有意义。
    • 不可能是正确的,因为您需要在运行时进行类型检查。当您if let x as Protocol 时,运行时会检查一致性。仅仅因为 ObjC 运行时没有看到 Swift 协议,并不意味着元数据不存在。你只需要与 Swift 运行时不同的 API。
    • 你可能至少对as?as! casts 是正确的)一个纯as cast 在编译时被检查并且将被优化出或进入桥接。对于as?as!,它可能需要以某种方式知道,尽管很可能是错位类型名称而不是您所知道的协议名称。不过我现在只是猜测。我们可以检查源代码(我认为 2016 年我回答时不可能)。
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多