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 seNSIndexPath
a 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.