upp*_*t99 5 hash realm ios swift
我有一个现有的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)
Run Code Online (Sandbox Code Playgroud)
我检查了Realmgit repo上的许多问题报告都没有成功(我相信有些被错误地标记为已关闭):
我试着和没有申报primaryKey,经过以及把虚拟初始(保证唯一)的ID dynamic var id = UUID().uuidString-但应该注意的是,Movie()被永远不会叫-我总是用(现在方便,有了这个境界重构)convenience init(title: String, id: String, cast: String )初始化器。
一些建议包括覆盖 ahash或hashValue变量,但后者已被前者冗余(而前者仍然对我不起作用 - 在本例中,我只是使用'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- 除非我遗漏了一些明显的东西......
| 归档时间: |
|
| 查看次数: |
437 次 |
| 最近记录: |