如何在 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
,而 ValueType
是 Set
的先决条件.
可以通过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.
我必须像这样满足 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
,而 ValueType
是 Set
的先决条件.
可以通过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.