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 {
// 処理は省略
}