实体和Equatable的模式是什么?

时间:2014-09-20 14:48:52

标签: swift

假设我有这个基类:

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中是否存在既定模式?

1 个答案:

答案 0 :(得分:0)

第一个重要问题是localIdid是否真的必须是可选的。如果这就是Entity所做的一切,那么作为协议而不是超类似乎更自然。并且不清楚为什么senderIdvar而不是let。但这些问题与主要问题不同。

进行平等检查。

我认为您不需要在此处进行所有!= nil检查。这应该没问题(至少在我的测试中):

func == (lhs: Entity, rhs: Entity) -> Bool {
  return object_getClassName(lhs) == object_getClassName(rhs) &&
    lhs.localId == rhs.localId
}

但我认为这里的基本想法没有任何问题。

(您认为可以使用lhs.dynamictype == rhs.dynamicType,但令人惊讶的是(对我来说)目前无法编译。)