假设我有这个基类:
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中是否存在既定模式?
答案 0 :(得分:0)
第一个重要问题是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
,但令人惊讶的是(对我来说)目前无法编译。)