实体和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中这种类型的东西是否存在已建立的模式?

第一个大问题是localIdid是否必须是可选的。如果这就是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,但令人惊讶的(对我)说目前不编译。)

+0

的想法是,'当实体插入到本地数据库localId'填充和当实体与远程数据库同步或从远程数据库下载时,会填充“id”。有些情况下,他们中的任何一个或两个都可能是“无”。我不知道'dynamicType',看起来奇怪的是== ==不起作用。看起来很奇怪,没有一种简单的方法来检查两个对象是否具有相同类型而不扩展'NSObject'。 – 2014-09-22 04:16:31