RealmSwift - 如何在将预先存在的类迁移到 Realm 时覆盖哈希函数

upp*_*t99 5 hash realm ios swift

我有一个现有的Movie类,我现在希望使用RealmSwift框架存储它。以前我已经遵守MovieHashable协议(用于Set()对电影数组执行操作),但是由于Realm遵守其Object协议的要求,这变得多余了。

但是,现在我对hash(into hasher: _)函数的(重新)声明出现错误(根据需要Hashable):

Overriding declarations in extensions is not supported
Overriding non-open instance method outside of its defining module
1. Overridden declaration is here (ObjectiveC.NSObject)
Run Code Online (Sandbox Code Playgroud)

声明 func hash(...) 的错误消息的屏幕截图,如先前要求符合 Hashable


我检查了Realmgit repo上的许多问题报告都没有成功(我相信有些被错误地标记为已关闭):

我试着和没有申报primaryKey,经过以及把虚拟初始(保证唯一)的ID dynamic var id = UUID().uuidString-但应该注意的是,Movie()永远不会叫-我总是用(现在方便,有了这个境界重构)convenience init(title: String, id: String, cast: String )初始化器。

一些建议包括覆盖 ahashhashValue变量,但后者已被前者冗余(而前者仍然对我不起作用 - 在本例中,我只是使用's的id参数:Moviehash/hashValue

override var hash: Int {
  return id.hashValue
}

override var hashValue: Int {
  return id.hashValue
}
Run Code Online (Sandbox Code Playgroud)

我的Movie代码如下(致命错误func hash(into hasher: inout Hasher) {如上图所示):

import Foundation
import UIKit
import EventKit
import RealmSwift

@objcMembers class Movie: Object {
 dynamic var title: String = ""
 dynamic var id: String = ""
 dynamic var cast: String  = ""

 convenience init(title: String, id: String, cast: String ) {
    self.init()
    self.title = title
    self.id = id
    self.cast = cast
 }

 override static func primaryKey() -> String? {
    return "id"
 }

 func hash(into hasher: inout Hasher) {
    hasher.combine(title)
    hasher.combine(id)
    hasher.combine(cast)
 }
}
Run Code Online (Sandbox Code Playgroud)

Set()我希望对电影数组执行的算术示例,[Movie]. 在此示例中,我正在检查是否subSetOfMovies是 的子集allMovies如果不是,则将其添加到以下列表中allMovies

 if !Set<Movie>(subSetOfMovies).isSubset(of: Set(allMovies)) {
   allMovies.append(contentsOf: subSetOfMovies)
 } else {
   print("subSetOfMovies is a subset of allMovies, thus it is not added.")
 }
Run Code Online (Sandbox Code Playgroud)

注意:我希望使用 Set 算法,因为它非常快。对于一长串电影,我不希望单独检查每部电影(例如使用 for 循环)是否包含在allMovies数组中。


基本上,我希望能够手动重新调整我的Movie类,Hashable以便我可以对其执行集合算术(就像我在开始实现RealmSwift我的Movie模型之前所做的那样)。然而,就目前的情况而言,似乎我不能Realm- 除非我遗漏了一些明显的东西......