Swift 5:如何创建包含类类型的集合(对于 NSXPCInterface)

Jer*_*ock 5 hashable swift

Apple 文档NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:),对于 Swift,第一个参数描述为:

\n\n

包含 Class 对象 \xe2\x80\x94 的 NSSet,例如 [MyObject class]

\n\n

嗯,看起来好像有人忽略了将其从 Objective-C 更新到 Swift。对于 Swift 我认为它应该是这样的

\n\n

包含类类型的集合

\n\n

(请有人纠正我的措辞。)但是如何制作包含类类型的 Set 呢? 编译器不允许我声明Set其成员类型不符合的成员Hashable。这是有道理的,因为需要哈希来保持成员之间的唯一性。但 Swift 中的类类型似乎不可散列。在任何 Swift 文件或游乐场\xe2\x80\xa6 中尝试此操作

\n\n
class Foo {}\nlet mySet: Set<AnyHashable>\nmySet.insert(Foo)\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译器抱怨:

\n\n

参数类型“Foo.Type”不符合预期类型“Hashable”

\n\n

或者,更广泛地说,有人知道如何NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)在 Swift 5 中使用吗?

\n

Rob*_*ier 5

您传递的类必须是 @objc 类(以及 NSObject 的子类)。您将把它们放入 NSSet 中,然后将其转换为 Set:

let classSet = NSSet(object: Foo.self) as! Set<AnyHashable>
Run Code Online (Sandbox Code Playgroud)

这几乎肯定是 NSXPCInterface 中的一个错误(它需要某种“针对 Swift 的优化”或可能是垫片),我建议在 bugreport.apple.com 上打开一个缺陷。