如何在 Swift 中使用 NSSet<Class>(导出为 Set<NSObject>)?

How to use NSSet<Class> in Swift (exported as Set<NSObject>)?

我必须像这样满足 Objective-C 中定义的协议要求:

@protocol AProtocol <NSObject>
+ (NSSet<Class> * _Nullable)someClasses;
@end

我想在Swift写的子class中实现这个协议。我想 return 一组 class 另一个对象。我要return的class是这样定义的:

class B: NSObject {}

符合协议的class是这样定义的:

class A: NSObject, AProtocol {
    static func someClasses() -> Set<NSObject>? {
        return [B.self]
    }
}

为什么 NSSet<Class> 桥接到 Set<NSObject> 而不是 Set?

这个解决方案崩溃了,我该如何解决这个问题?

NSSet<Class> 桥接到 Set<NSObject>,因为 AnyClass 不符合 Hashable,而 ValueTypeSet 的先决条件.

可以通过NSObjectProtocol的以下扩展来解决:

extension NSObjectProtocol where Self: NSObject {
    static var objcClass: NSObject {
        return (self as AnyObject) as! NSObject
    }
}

此 returns 对象的 class 被转换为 NSObject。需要先转为AnyObject,因为Swift的类型系统太强了,直接转类型为实例类型时,既不会编译也不会报错。在 Objective-C 中这很好,因为 Class 也只是一个对象。由于 NSObject 在 Objective-C 中实现并且扩展仅用于 NSObjectProtocol,因此可以保存使用(即使使用强制转换)。 在 NSObjectProtocol 而不是 NSObject 上实现扩展本身带来了积极的效果,即它不会导出到 Objective-C.