Objective c 如何使用NSSet<;类别>;在Swift中(导出为集合<;NSObject>;)?
我必须满足Objective-C中定义的协议要求,如下所示: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
@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生成的,我将它添加到原始帖子中。好的,问题本身已经解决了,我将编辑问题并添加答案,也许这对其他人有帮助。