Swift 5:如何创建包含 Class 类型的集合(针对 NSXPCInterface)
Swift 5: How to make a Set containing Class Types (for NSXPCInterface)
在NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)
的Apple documentation中,对于Swift,第一个参数描述为:
一个包含 Class 个对象的 NSSet — 例如,[MyObject class].
嗯,好像有人忘记将它从 Objective-C 更新到 Swift。对于 Swift,我认为它应该类似于
包含 Class 类型的集合
(请有人纠正我的措辞。)但是 你如何创建一个包含 Class 类型的集合? 编译器不允许我声明一个 Set
的成员类型不符合Hashable
。这是有道理的,因为需要散列来保持成员之间的唯一性。但是 Class Swift 中的类型似乎不可散列。在任何 Swift 文件或操场上试试这个…
class Foo {}
let mySet: Set<AnyHashable>
mySet.insert(Foo)
编译器抱怨:
参数类型'Foo.Type'不符合预期类型'Hashable'
或者,更广泛地说,有谁知道如何在 Swift 5 中使用 NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)
?
你传递的类需要是@objc类(和NSObject的sub类)。您会将它们放入 NSSet,然后将其转换为 Set:
let classSet = NSSet(object: Foo.self) as! Set<AnyHashable>
这几乎可以肯定是 NSXPCInterface 中的一个错误(它需要某种 "refine for Swift" 或者可能是填充程序),我建议在 bugreport.apple.com.
打开一个缺陷
从 Swift v5.6(可能更早)开始,您可以在不强制转换的情况下创建集合:
let classSet = NSSet().adding(Foo.self)
这是因为 adding()
是这样声明的:
open func adding(_ anObject: Any) -> Set<AnyHashable>
在NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)
的Apple documentation中,对于Swift,第一个参数描述为:
一个包含 Class 个对象的 NSSet — 例如,[MyObject class].
嗯,好像有人忘记将它从 Objective-C 更新到 Swift。对于 Swift,我认为它应该类似于
包含 Class 类型的集合
(请有人纠正我的措辞。)但是 你如何创建一个包含 Class 类型的集合? 编译器不允许我声明一个 Set
的成员类型不符合Hashable
。这是有道理的,因为需要散列来保持成员之间的唯一性。但是 Class Swift 中的类型似乎不可散列。在任何 Swift 文件或操场上试试这个…
class Foo {}
let mySet: Set<AnyHashable>
mySet.insert(Foo)
编译器抱怨:
参数类型'Foo.Type'不符合预期类型'Hashable'
或者,更广泛地说,有谁知道如何在 Swift 5 中使用 NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)
?
你传递的类需要是@objc类(和NSObject的sub类)。您会将它们放入 NSSet,然后将其转换为 Set:
let classSet = NSSet(object: Foo.self) as! Set<AnyHashable>
这几乎可以肯定是 NSXPCInterface 中的一个错误(它需要某种 "refine for Swift" 或者可能是填充程序),我建议在 bugreport.apple.com.
打开一个缺陷从 Swift v5.6(可能更早)开始,您可以在不强制转换的情况下创建集合:
let classSet = NSSet().adding(Foo.self)
这是因为 adding()
是这样声明的:
open func adding(_ anObject: Any) -> Set<AnyHashable>