web-dev-qa-db-ja.com

2つのNSIndexPathを比較する方法は?

パスのインデックス付けが等しいかどうかをテストする方法を探しています。等しいとは、すべてのレベルで等しいということですか。私は試した compare:が機能しないようですが、インデックスが完全に同じでなくても、NSOrderedSameと比較すると常にtrueになります。

33
Valentin Radu

ほとんどすべてのObjective-Cオブジェクトは、isEqual:メソッドを使用して比較できます。したがって、等価性をテストするには、[itemCategoryIndexPath isEqual:indexPath]が必要であり、それで問題ありません。 NSObjectisEqual:を実装しているため、これは機能します。したがって、すべてのオブジェクトが自動的にそのメソッドを持ちますが、特定のクラスがそれをオーバーライドしない場合、isEqual:はオブジェクトポインターを比較するだけです。

NSIndexPathの場合、isEqual:メソッドがオーバーライドされているため、期待どおりにオブジェクトを比較できます。しかし、新しいクラスMyObjectを記述してメソッドをオーバーライドしない場合、[instanceOfMyObject isEqual:anotherInstanceOfMyObject]instanceOfMyObject == anotherInstanceOfMyObjectと実質的に同じになります。


詳細は NSObject Protocol Reference を参照してください。

90
Itai Ferber

Swiftでは、NSIndexPathsが同じかどうかを比較するために==を使用します。

import UIKit

var indexPath1 = NSIndexPath(forRow: 1, inSection: 0)
var indexPath2 = NSIndexPath(forRow: 1, inSection: 0)
var indexPath3 = NSIndexPath(forRow: 2, inSection: 0)
var indexPath4 = indexPath1

println(indexPath1 == indexPath2) // prints "true"
println(indexPath1 == indexPath3) // prints "false"
println(indexPath1 == indexPath4) // prints "true"

println(indexPath1 === indexPath2) // prints "true"
println(indexPath1 === indexPath3) // prints "false"
println(indexPath1 === indexPath4) // prints "true"

Swiftは値の比較に==を使用します。 ===は、2つの変数がまったく同じインスタンス(メモリ内の場所など)を参照するときを検出するために使用されます。興味深いことに、indexPath1 === indexPath2は、値(セクション行)が一致するときはいつでも同じインスタンスを共有するようにNSIndexPathが構築されていることを示しているため、インスタンスを比較していても有効です。

この回答は、ほぼ完全に この素晴らしいSO drewagからの回答 から取られ、ここで再現されています。これは、「インデックスパスの比較」の最初のGoogle結果であり、リンクを貼り付けます。

9
Joshua Dance