swift - 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 中使用吗?
解决方案
您传递的类需要是 @objc 类(和 NSObject 的子类)。您将它们放入一个 NSSet,然后将其转换为 Set:
let classSet = NSSet(object: Foo.self) as! Set<AnyHashable>
这几乎可以肯定是 NSXPCInterface 中的一个错误(它需要某种“为 Swift 优化”或者可能是 shim),我建议在 bugreport.apple.com 上打开一个缺陷。
推荐阅读
- javascript - 安全登录到 Vue.js SPA
- vba - 在会话之间使用增量变量复制文件
- c# - 无效的列名 | C#
- javascript - 如何使用 Jest + Enzyme 测试谷歌地图功能是否在 componentDidUpdate() 上运行?
- flutter - 我正在用颤振构建一个照片编辑应用程序,它可以在从图库中挑选的图像上应用内置的照片过滤器
- node.js - 限制用户通过 GET 请求访问 admin 和 _id 详细信息
- spring-boot - 找不到属性 SpringBoot JPA
- python - 我可以用 groupy 和 pandas 计算百分比吗
- angular - 我怎样才能把这个物体以角度的方式放在材料表中
- docker - 在 docker4drupal 中安装 npm 和 gulp