首页 > 解决方案 > Swift 5:如何创建包含类类型的集合(适用于 NSXPCInterface)

问题描述

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

一个包含 Class 对象的 NSSet ——例如, [MyObject class]

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

包含类类型的集合

(有人请纠正我的措辞。)但是你如何制作一个包含类类型的集合? 编译器不允许我声明Set其成员类型不是不符合的Hashable。这是有道理的,因为需要散列来保持成员之间的唯一性。但是 Swift 中的类类型似乎不是可散列的。在任何 Swift 文件或操场上试试这个……</p>

class Foo {}
let mySet: Set<AnyHashable>
mySet.insert(Foo)

编译器抱怨:

参数类型 'Foo.Type' 不符合预期的类型 'Hashable'

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

标签: swifthashable

解决方案


您传递的类需要是 @objc 类(和 NSObject 的子类)。您将它们放入一个 NSSet,然后将其转换为 Set:

let classSet = NSSet(object: Foo.self) as! Set<AnyHashable>

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


推荐阅读