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>