我必须满足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?
此解决方案崩溃,我该如何解决问题?
答案 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。