我有一个现有的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)
我检查了Realm
git存储库上的许多问题报告,但均未成功(我相信有些报告被错误地标记为已关闭):
我尝试了是否使用已声明的primaryKey
,并通过dynamic var id = UUID().uuidString
放置了一个虚拟的初始(保证唯一)ID-尽管应该注意Movie()
是< strong> Never 称为-我始终使用convenience init(title: String, id: String, cast: String )
初始化程序(使用此Realm重构现在很方便)。
一些建议包括覆盖hash
或hashValue
变量,但是前者已使后者多余(而前者仍然对我不起作用-在此示例中,我是只需对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
我无法接受-除非我遗漏了明显的东西...