假设我有这个基类:
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中对这类事情有既定的模式吗?
发布于 2014-09-22 09:54:30
第一个大问题是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,但令人惊讶的是(对我而言)它目前还不能编译。)
https://stackoverflow.com/questions/25949975
复制相似问题