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 seNSIndexPatha la claseNSIndexPath.
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.