2011-06-16 28 views
30

Estoy buscando una forma de comprobar si las rutas de indexación son iguales, y por igual quiero decir igual en cada nivel? Intenté compare: pero parece que no funciona, siempre me pongo cierto en comparación con NSOrderedSame, incluso si los índices definitivamente no son los mismos.¿Cómo comparar dos NSIndexPaths?

+1

Por favor, publique su código usando el método compare :. – thomashw

+8

'[itemCategoryIndexPath compare: indexPath] == NSOrderedSame' bastante sencillo, ¿me falta algo? –

+0

@Valentin Radu, en su comentario anterior, ¿quiere decir que 'compare:' funciona, al contrario de lo que mencionó en su pregunta? – Vasu

Respuesta

87

Casi todos los objetos Objective-C se pueden comparar utilizando el método isEqual:. Entonces, para probar la igualdad, solo necesita [itemCategoryIndexPath isEqual:indexPath], y listo. Ahora, esto funciona porque NSObject implementa isEqual:, por lo que todos los objetos tienen automáticamente ese método, pero si una clase determinada no lo anula, isEqual: simplemente comparará punteros de objeto.

En el caso de NSIndexPath, ya que el método isEqual: ha sido anulado, puede comparar los objetos como era de esperar. Pero si tuviera que escribir una nueva clase, MyObject y no anular el método, [instanceOfMyObject isEqual:anotherInstanceOfMyObject] sería lo mismo que instanceOfMyObject == anotherInstanceOfMyObject.


Puede encontrar más en el NSObject Protocol Reference.

+1

'isEqual' funciona, gracias! –

+0

@Itai Ferber, ¿cómo se puede saber si un método ha sido anulado o no? – Vasu

+0

@Kailash No puede saber necesariamente si un método ha sido anulado. Creo que puede haber una manera, pero no estoy seguro; no está dentro del ámbito de la programación cotidiana; llevaría bastante tiempo jugar con el tiempo de ejecución. De todos modos, en su mayor parte, no habría ninguna razón para necesitar saber si una clase anula este método, ya que le brinda la funcionalidad que necesita. Siempre use 'isEqual:' en objetos, y deje que la clase maneje el problema por usted. –

8

En Swift utiliza == para comparar si NSIndexPaths son iguales.

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 utiliza == para las comparaciones de valor. === se usa para detectar cuando dos variables hacen referencia a la misma instancia (ubicación en la memoria, etc.). Curiosamente, el indexPath1 === indexPath2 muestra que NSIndexPath está diseñado para compartir la misma instancia siempre que los valores (fila de sección) coincidan, por lo que incluso si estuviera comparando instancias, aún sería válido.

Esta respuesta se tomó casi por completo de this fantastic SO answer from drewag y se reproduce aquí ya que este es el primer resultado de Google para 'compare indexpath' y se supone que no solo debemos pegar un enlace.

+1

Esta pregunta tiene casi 4 años, está etiquetada como objetivo-c y tiene una respuesta aceptada. Creo que sería mejor publicar esto como respuesta a una pregunta por separado. – sbooth

+3

Solo estoy tratando de ayudar a futuros novatos como yo. Este es el resultado # 1 cuando Google 'compara indexPath'. Haré una pregunta por separado y publicaré esta respuesta, pero las personas van a encontrar esto primero por mucho tiempo. :) –

+1

En realidad, la pregunta ya fue formulada, como mencioné en mi respuesta. http://stackoverflow.com/questions/25172525/comparing-nsindexpath-swift - Pero incluso la búsqueda en el sitio no muestra esa pregunta cuando busca 'compare indexpath swift'. Simplemente muestra esta respuesta. Así que voy a dejar mi respuesta aquí para señalar a las personas allí. –