在NSXPCInterface.setClasses(_:for:argumentIndex:ofReply:)
的Apple文档中,对于Swift,第一个参数描述为:
一个包含类对象的NSSET - 例如,[myObject class] 。
hmmm,似乎有人忽略了从Objective-C更新到Swift。对于Swift,我认为应该像
一个包含类类型的集
(有人请更正我的措辞。(但是如何制作包含类类型的集合?编译器不允许我声明其成员类型不符合Hashable
的Set
。这是有道理的,因为需要哈希来保持成员之间的独特性。但是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一起工作。