ios - 在 Swift 中使用 Hashable 扩展 @objc 协议(protocol)

标签 ios objective-c swift

我有一个带有这个实现的@objc 协议(protocol):

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

   func generatePreview()
} 

我正尝试在 [Document: Int] 字典中使用它,但自然会出现此错误:

Type 'Document' does not conform to protocol 'Hashable'

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

@objc protocol 'Document' cannot refine non-@objc protocol 'Hashable'

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

这个协议(protocol)看起来像这样:

@objc public protocol MyClassDelegate: class {

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

}

有什么想法吗?

最佳答案

您可以使用 [AnyHashable: Int],这是一个类型删除的可哈希值。

我假设你有一个名为 Document 的协议(protocol):

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

    func generatePreview()
}

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

@objc public protocol MyClassDelegate: class {

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

}

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

don't use protocols as keys in dictionaries. It never goes well and all the workarounds are a pain.

我的回答可能不是很完美,但希望这能让错误消失。

关于ios - 在 Swift 中使用 Hashable 扩展 @objc 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49488189/

相关文章:

ios - ID 为 :[. ..] 的 NSManagedObject 已失效

ios - 是否可以将 SwiftUI 列表项文本选择性地设置为常见问题解答部分的粗体?

ios - 在框架中覆盖 Storyboard中的图像

ios - 在AVAudioPlayer中停止声音并显示AQDefaultDevice(173):跳过输入流错误日志

ios - CollectionView 会用标识符访问displayCell

ios - 如何设置选择器 View 的原始选项?

objective-c - NSURLConnection 中的保证顺序

objective-c - Grand Central Dispatch 延迟执行设计模式

ios - 我应该在 ViewController 中的什么位置放置初始化代码?

swift - 如何解决 myModel 变量中的 UserDefaults 设置错误?