在 Swift 中使用 Hashable 扩展 @objc 协议

kik*_*tas 5 objective-c ios swift

我有@objc这个实现的协议:

@objc public protocol Document: class {
   var data: Data? { get }
   var image: UIImage? { get }

   func generatePreview()
} 
Run Code Online (Sandbox Code Playgroud)

我试图在[Document: Int]字典中使用它,但很自然地我得到了这个错误:

类型“文档”不符合协议“Hashable”

问题是我不知道如何使它符合Hashable,因为它是一个@objc协议并且Hashable只在 Swift 中可用。如果我尝试使其符合Hashable,我会收到此错误:

@objc 协议“文档”无法细化非@objc 协议“Hashable”

该协议用作方法中的属性@objc,我想将其保留为“@objc”方法,因为它是@objc委托协议的一部分。

该协议如下所示:

@objc public protocol MyClassDelegate: class {

    @objc func methodOne(parameter: [Document: Int])

}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Aao*_*oIi 3

您可以使用[AnyHashable: Int]类型擦除的可哈希值。

我假设您有名为 Document 的协议:

@objc public protocol Document: class {
    var data: Data? { get }
    var image: UIImage? { get }

    func generatePreview()
}
Run Code Online (Sandbox Code Playgroud)

并且您的协议 methodOne 将接受 [AnyHashable: Int]:

@objc public protocol MyClassDelegate: class {

     @objc func methodOne(parameter: [AnyHashable: Int])

}
Run Code Online (Sandbox Code Playgroud)

这是一个有点复杂的问题,经过一番研究我同意@Rob Napier 的观点

不要使用协议作为字典中的键。它永远不会顺利,所有的解决方法都是痛苦的。

我可能没有完美回答,但希望这能让错误消失。