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



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

一个包含类对象的NSSET - 例如,[myObject class]

hmmm,似乎有人忽略了从Objective-C更新到Swift。对于Swift,我认为应该像

一个包含类类型的集

(有人请更正我的措辞。(但是如何制作包含类类型的集合?编译器不允许我声明其成员类型不符合HashableSet。这是有道理的,因为需要哈希来保持成员之间的独特性。但是Swift中的课程类型似乎并不是可覆盖的。在任何Swift文件或操场上尝试一下……

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

编译器抱怨:

参数类型'foo.type'不符合预期类型'hashable'

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

您通过的类是@OBJC类(以及NSOBJECT的子类(。您将将它们放入NSSET中,然后将其施放以设置:

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

这几乎可以肯定是NSXPCInterface中的一个错误(它需要某种"适合Swift"或可能是垫片(,我建议您在BugReport.Apple.com。

从Swift V5.6(也许更早(开始,您可以在不铸造的情况下创建集合:

let classSet = NSSet().adding(Foo.self)

这是因为 adding()是这样声明的:

open func adding(_ anObject: Any) -> Set<AnyHashable>

从任意类型中获得 Set<AnyHashable>的最简单语法可能是:

let classSet = [Foo.self] as NSSet as Set

不需要施法,并且与NSXPCInterface一起工作。

相关内容

最新更新