swift nsindexpath

Comparando NSIndexPath Swift



(2)

Con Swift, puedes usar NSIndexPath o IndexPath . Ambos tienen la misma estrategia para comparar.

# 1. NSIndexPath

Según la documentación de Apple, NSIndexPath cumple con el protocolo Equatable . Por lo tanto, puede usar los operadores == o != Para comparar dos instancias de NSIndexPath .

# 2. IndexPath

Los estados de la documentación de Apple sobre NSIndexPath e IndexPath :

La superposición Swift al marco de Foundation proporciona la estructura IndexPath , que se NSIndexPath a la clase NSIndexPath .

Esto significa que, como alternativa a NSIndexPath , comenzando con Swift 3 y Xcode 8, puede usar IndexPath . Tenga en cuenta que IndexPath también se ajusta al protocolo Equatable . Por lo tanto, puede usar los operadores == o != Para comparar dos instancias de él.

Si tengo una constante NSIndexPath declarada para un UITableView, ¿es válido comparar usando el operador == ?

Esta es mi declaración constante:

let DepartureDatePickerIndexPath = NSIndexPath(forRow: 2, inSection: 0)

Y luego mi función:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat { var height: CGFloat = 45 if indexPath == DepartureDatePickerIndexPath{ height = departureDatePickerShowing ? 162 : 0 } else if indexPath == ArrivalDatePickerIndexPath { height = arrivalDatePickerShowing ? 162 : 0 } return height }

Esto ciertamente funciona correctamente, pero ¿es seguro hacerlo? Supongo que, dado que funciona, el operador == en el objeto NSIndexPath está comparando las propiedades de sección y fila en lugar de la instancia.


Vamos a hacer una prueba muy simple:

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"

Sí, es seguro usar == con NSIndexPath

Como nota al margen, == en Swift es siempre para comparaciones de valores. === se utiliza para detectar cuándo dos variables hacen referencia a la misma instancia exacta. Curiosamente, indexPath1 === indexPath2 muestra que NSIndexPath está diseñado para compartir la misma instancia cada vez que coinciden los valores, por lo que incluso si estuviera comparando instancias, aún sería válido.