实体和Equatable的模式是什么?
问题描述:
假设我有这个基类:实体和Equatable的模式是什么?
class Entity: Equatable {
init() {
}
var localId: Int32?
var id: Int32?
}
func == (lhs: Entity, rhs: Entity) -> Bool {
return object_getClassName(lhs) == object_getClassName(rhs) &&
lhs.localId != nil &&
rhs.localId != nil &&
lhs.localId == rhs.localId
}
,并沿此线的一些实体实现的:
class Message: Entity {
init(senderId: Int32, body: String, sentDateTime: NSDate) {
self.senderId = senderId
self.body = body
self.sentDateTime = sentDateTime
super.init()
}
var senderId: Int32
var body: String
var sentDateTime: NSDate
}
我是否考虑与Equatable
执行正确的方法?我比较类名的原因是localId
的唯一性是针对每个实体类型的作用域。我应该为每个实体类实施Equatable
吗? Swift中这种类型的东西是否存在已建立的模式?
答
第一个大问题是localId
和id
是否必须是可选的。如果这就是Entity
所做的一切,那么作为协议而不是超类似乎更自然。目前还不清楚为什么senderId
等是var
而不是let
。但这些是主要问题的不同问题。
对平等检查。
我不相信你在这里需要所有!= nil
检查。这应该没问题(至少在我的测试中):
func == (lhs: Entity, rhs: Entity) -> Bool {
return object_getClassName(lhs) == object_getClassName(rhs) &&
lhs.localId == rhs.localId
}
但我在这里看不到任何问题。
(你以为你可以使用lhs.dynamictype == rhs.dynamicType
,但令人惊讶的(对我)说目前不编译。)
的想法是,'当实体插入到本地数据库localId'填充和当实体与远程数据库同步或从远程数据库下载时,会填充“id”。有些情况下,他们中的任何一个或两个都可能是“无”。我不知道'dynamicType',看起来奇怪的是== ==不起作用。看起来很奇怪,没有一种简单的方法来检查两个对象是否具有相同类型而不扩展'NSObject'。 – 2014-09-22 04:16:31