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

时间:2016-07-26 10:10:37

标签: objective-c swift nsobject

我必须满足Objective-C中定义的协议要求,如下所示:

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

我想在用Swift编写的子类中实现这个协议。我想返回另一个Object的一组类。我想要返回的类定义如下:

class B: NSObject {}

符合协议的类定义如下:

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

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

此解决方案崩溃,我该如何解决问题?

1 个答案:

答案 0 :(得分:0)

NSSet<Class>被桥接到Set<NSObject>,因为AnyClass不符合Hashable,这是ValueType Set的先决条件。< / p>

可以使用NSObjectProtocol的以下扩展名来解决:

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

这将返回作为NSObject的对象的类。首先必须将其强制转换为AnyObject,因为Swift的类型系统非常强大,以至于在将类型直接转换为实例类型时不会编译或发出警告。在Objective-C中这很好,因为Class也只是一个对象。由于NSObject是在Objective-C中实现的,并且扩展仅适用于NSObjectProtocol,因此可以使用(即使使用强制转换)。 在NSObjectProtocol上而不是在NSObject上实现扩展会带来积极的影响,即它不会导出到Objective-C。