Objective c 如何使用NSSet<;类别>;在Swift中(导出为集合<;NSObject>;)?

Objective c 如何使用NSSet<;类别>;在Swift中(导出为集合<;NSObject>;)?,objective-c,swift,nsobject,Objective C,Swift,Nsobject,我必须满足Objective-C中定义的协议要求,如下所示: @protocol AProtocol <NSObject> + (NSSet<Class> * _Nullable)someClasses; @end class B: NSObject {} class A: NSObject, AProtocol { static func someClasses() -> Set<NSObject>? { return [B

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

@protocol AProtocol <NSObject>
+ (NSSet<Class> * _Nullable)someClasses;
@end
class B: NSObject {}
class A: NSObject, AProtocol {
    static func someClasses() -> Set<NSObject>? {
        return [B.self]
    }
}
符合协议的类定义如下:

@protocol AProtocol <NSObject>
+ (NSSet<Class> * _Nullable)someClasses;
@end
class B: NSObject {}
class A: NSObject, AProtocol {
    static func someClasses() -> Set<NSObject>? {
        return [B.self]
    }
}
A类:NSObject,AProtocol{
静态func someClasses()->Set{
返回[B.self]
}
}
为什么将
NSSet
桥接到
Set
而不是Set

此解决方案正在崩溃,如何解决此问题?

NSSet
被桥接到
Set
,因为
AnyClass
不符合
Hashable
,这是
Set
ValueType
的先决条件

它可以通过以下扩展来解决
NSObjectProtocol

extension NSObjectProtocol where Self: NSObject {
    static var objcClass: NSObject {
        return (self as AnyObject) as! NSObject
    }
}
这将返回铸造为
NSObject
的对象的类。必须首先将其强制转换为
AnyObject
,因为Swift的类型系统非常强大,当直接将类型强制转换为实例类型时,它不会编译或发出警告。在Objective-C中,这很好,因为类也只是一个对象。由于
NSObject
是在Objective-C中实现的,并且扩展仅适用于
NSObjectProtocol
,因此可以保存以供使用(即使使用强制转换)。 在
NSObjectProtocol
上实现扩展而不是在
NSObject
本身上实现扩展会带来积极的效果,即它不会导出到Objective-C。

NSSet
被桥接到
Set
,因为
AnyClass
不符合
Hashable
,这是
ValueType
的先决条件设置的
集合的

它可以通过以下扩展来解决
NSObjectProtocol

extension NSObjectProtocol where Self: NSObject {
    static var objcClass: NSObject {
        return (self as AnyObject) as! NSObject
    }
}
这将返回铸造为
NSObject
的对象的类。必须首先将其强制转换为
AnyObject
,因为Swift的类型系统非常强大,当直接将类型强制转换为实例类型时,它不会编译或发出警告。在Objective-C中,这很好,因为类也只是一个对象。由于
NSObject
是在Objective-C中实现的,并且扩展仅适用于
NSObjectProtocol
,因此可以保存以供使用(即使使用强制转换)。
NSObjectProtocol
上实现扩展而不是在
NSObject
本身上实现扩展带来了积极的效果,即它不会导出到Objective-C。

一个问题,我看不出返回
Set?
如何满足协议上的
NSSet
返回类型。这不是应该设置的吗?另外,请包括AppDelegate类型的声明。@PatrickGoley是的,我完全理解这种混淆,这也让我感到困惑。正如有人向我解释的那样:类只是Objective-C中的一个对象,这就是为什么要这样桥接它。我认为,在其他情况下,他们是在将其桥接到AnyClass,但由于AnyClass不符合Hashable(这是Set的先决条件),这是不可能的。Xcode为协议生成如下接口。AppDelegate是由Xcode生成的,我将它添加到原始帖子中。好的,问题本身已经解决了,我将编辑问题并添加答案,可能对其他人有帮助。有一个问题,我不知道返回
Set?
如何满足协议上的
NSSet
返回类型。这不是应该设置的吗?另外,请包括AppDelegate类型的声明。@PatrickGoley是的,我完全理解这种混淆,这也让我感到困惑。正如有人向我解释的那样:类只是Objective-C中的一个对象,这就是为什么要这样桥接它。我认为,在其他情况下,他们是在将其桥接到AnyClass,但由于AnyClass不符合Hashable(这是Set的先决条件),这是不可能的。Xcode为协议生成如下接口。AppDelegate是由Xcode生成的,我将它添加到原始帖子中。好的,问题本身已经解决了,我将编辑问题并添加答案,也许这对其他人有帮助。