如何比较两个NSIndexPath?

34

我正在寻找一种方法来测试是否相等的索引路径,并且相等的意思是在每个级别上都相等?我尝试了compare:,但似乎不起作用,即使索引明显不同,与NSOrderedSame比较时我总是得到true。


1
请使用 compare: 方法发布您的代码。 - thomashw
8
"[itemCategoryIndexPath compare:indexPath]==NSOrderedSame" 相当直接,我有什么遗漏吗? - Rad'Val
@Valentin Radu,在您之前的评论中,您是指 compare: 起作用了,与您在问题中提到的相反吗? - Vasu
2个回答

91
几乎所有的Objective-C对象都可以使用isEqual:方法进行比较。因此,要测试相等性,您只需要[itemCategoryIndexPath isEqual:indexPath],就可以了。现在,这是有效的,因为NSObject实现了isEqual:方法,所以所有对象都自动具有该方法。但如果某个类没有重写它,isEqual:只会比较对象指针。
NSIndexPath的情况下,由于已经覆盖了isEqual:方法,因此可以像您期望的那样比较对象。但是,如果我编写一个新类MyObject并且没有重写该方法,[instanceOfMyObject isEqual:anotherInstanceOfMyObject]实际上将与instanceOfMyObject == anotherInstanceOfMyObject相同。
更多信息请参见NSObject Protocol Reference

@Itai Ferber,如何知道一个方法是否被覆盖了。 - Vasu
@Kailash 你不能确定一个方法是否被覆盖。我认为可能有一种方法,但我不确定;这不是日常编程的范畴 - 它需要在运行时进行一些混乱操作。无论如何,大多数情况下,没有必要知道一个类是否覆盖了这个方法,因为它为你提供了所需的功能。始终对对象使用isEqual:,并让类本身为您处理问题。 - Itai Ferber
1
+1 我不知道isEqual:在未实现时比较指针。 很好知道! - LilDwarf

10

在Swift中,你使用==来比较NSIndexPath是否相同。

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使用==进行值比较。===用于检测两个变量是否引用了完全相同的实例(内存位置等)。有趣的是,indexPath1 === indexPath2表明NSIndexPath被构建为在数值匹配时共享相同的实例(section row),所以即使您正在比较实例,它仍然有效。

这个答案几乎完全来自于这个出色的SO答案来自drewag,并且在此重复,因为这是“比较indexpath”的第一个谷歌搜索结果,我们不应该只粘贴链接。


1
这个问题已经存在将近4年了,标记为objective-c,并且有一个被接受的答案。我认为最好将其作为一个独立问题的答案发布。 - sbooth
3
我会尽力帮助像我一样的新手。这是你在谷歌上搜索“compare indexPath”时排名第一的结果。我将提一个单独的问题并发布此答案,但人们很长一段时间都会首先找到这个。 :) - Joshua Dance
1
实际上,这个问题已经被问过了,就像我在我的回答中提到的那样。https://dev59.com/z18e5IYBdhLWcg3w-OUn - 但是,即使在现场搜索中搜索“compare indexpath swift”,也不会显示该问题。它只显示这个答案。因此,我将在这里留下我的答案,以指引人们去那里。 - Joshua Dance
1
既然你发布了另一个问题的链接,它现在出现在侧边栏中了。希望像你说的那样,它能帮助未来的某个人——Objective-C和Swift的水确实有些混浊。 - sbooth
3
这帮了我,兄弟。我在寻找 Swift 的相关内容,然后看到了这篇帖子。 - Edward Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接