2014-09-20 60 views
0

假設我有這個基類:實體和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中這種類型的東西是否存在已建立的模式?

回答

0

第一個大問題是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