UKey's Labo

swiftでオブジェクトの比較(isEqualを実装)

動作環境

環境 バージョン
Xcode 9.4.1
iOS 11.4
swift 4.1.2

オブジェクトの比較

==でオブジェクトの比較ができるようにします。
オブジェクトのフィールドを一つ一つ比較するのもありなのですが、冗長になるし、
フィールドが増える度に比較を行っているところに手を入れるのもメンテナンス性が低いので
調べてみました。以外と簡単にできました。

比較の実装

比較を行いたいクラスでisEqual(_ object: Any?) -> Boolを実装する

以下のようなクラスの場合

class Item: Object { 
    // アイテムID
    @objc dynamic var itemId: Int = 0
    // アイテム名
    @objc dynamic var itemName: String = ""
    // メモ
    @objc dynamic var memo: String = ""
}

比較関数の実装

override func isEqual(_ object: Any?) -> Bool {
    if let target: Item = object as? Item {
        if     target.itemId   != self.itemId
            || target.itemName != self.itemName
            || target.memo     != self.memo {
            // どれかひとつでも異なる値があればtrue
            return true
        }
        return false
    }
    // objectがItemでなかった場合も、!=ということでtrueを返す
    return true
}

実際に比較してみる

比較を行う際は、==で比較します
isEqualを実際すると、==でオブジェクトを比較した際に、isEqualが呼び出されます

let item1: Item = itemIntractor.selectByItemId(itemId: self.itemId)
let item2: Item = itemIntractor.selectByItemName(itemName: self.itemName)

// isEqualで比較する
if item1 == item2 {
    // 処理は省略
}