【问题标题】:Swift 5: How to make a Set containing Class Types (for NSXPCInterface)Swift 5:如何创建包含类类型的集合(适用于 NSXPCInterface)
【发布时间】:2019-09-24 11:13:54
【问题描述】:

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

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

嗯,似乎有人忽略了将其从 Objective-C 更新到 Swift。对于 Swift,我认为它应该类似于

包含类类型的集合

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

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

编译器抱怨:

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

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

【问题讨论】:

    标签: swift hashable


    【解决方案1】:

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

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

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

    【讨论】:

    • 您的解决方法非常完美,Rob。我已提交 Apple Bug 50514123。
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多