RealmSwift-将现有的类迁移到Realm时如何覆盖哈希函数

时间:2019-01-09 13:21:58

标签: ios swift hash realm

我有一个现有的Movie类,现在希望使用RealmSwift框架进行存储。以前,我已经使Movie符合Hashable协议(用于在电影数组上执行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)

Screenshot of the error messages from declaring func hash(...), as previously required to conform to Hashable


我检查了Realm git存储库上的许多问题报告,但均未成功(我相信有些报告被错误地标记为已关闭):

我尝试了是否使用已声明的primaryKey,并通过dynamic var id = UUID().uuidString放置了一个虚拟的初始(保证唯一)ID-尽管应该注意Movie()是< strong> Never 称为-我始终使用convenience init(title: String, id: String, cast: String )初始化程序(使用此Realm重构现在很方便)。

一些建议包括覆盖hashhashValue变量,但是前者已使后者多余(而前者仍然对我不起作用-在此示例中,我是只需对id的{​​{1}}使用Movie参数:

hash/hashValue

我的override var hash: Int { return id.hashValue } override var hashValue: Int { return id.hashValue } 代码如下(如上面的屏幕截图所示,在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) } } 上执行的Set()算法的示例。在此示例中,我正在检查[Movie]是否为subSetOfMovies的子集,如果不是 ,则将其添加到allMovies的列表中:

allMovies

注意:我希望使用Set算法,因为它非常快。对于较长的电影列表,我不希望检查 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.") } 数组中是否单独包含每个电影(例如带有for循环的电影)。


基本上,我希望能够将allMovies类手动重新整合为Movie,以便可以对其执行设置算术运算(就像我开始实现Hashable到我的RealmSwift模型)。但是,按照目前的情况,看来Movie我无法接受-除非我遗漏了明显的东西...

0 个答案:

没有答案