パスのインデックス付けが等しいかどうかをテストする方法を探しています。等しいとは、すべてのレベルで等しいということですか。私は試した compare:
が機能しないようですが、インデックスが完全に同じでなくても、NSOrderedSame
と比較すると常にtrueになります。
ほとんどすべてのObjective-Cオブジェクトは、isEqual:
メソッドを使用して比較できます。したがって、等価性をテストするには、[itemCategoryIndexPath isEqual:indexPath]
が必要であり、それで問題ありません。 NSObject
はisEqual:
を実装しているため、これは機能します。したがって、すべてのオブジェクトが自動的にそのメソッドを持ちますが、特定のクラスがそれをオーバーライドしない場合、isEqual:
はオブジェクトポインターを比較するだけです。
NSIndexPath
の場合、isEqual:
メソッドがオーバーライドされているため、期待どおりにオブジェクトを比較できます。しかし、新しいクラスMyObject
を記述してメソッドをオーバーライドしない場合、[instanceOfMyObject isEqual:anotherInstanceOfMyObject]
はinstanceOfMyObject == anotherInstanceOfMyObject
と実質的に同じになります。
詳細は NSObject Protocol Reference を参照してください。
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結果であり、リンクを貼り付けます。