Si une constante NSIndexPath est déclarée pour un UITableView, est-il valide de comparer à l'aide de l'opérateur ==
?
Ceci est ma déclaration constante:
let DepartureDatePickerIndexPath = NSIndexPath(forRow: 2, inSection: 0)
Et puis ma fonction:
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
}
Cela fonctionne certainement correctement, mais est-il sécuritaire de le faire? Je suppose que puisque cela fonctionne, l'opérateur ==
de l'objet NSIndexPath compare les propriétés de section et de ligne au lieu de l'instance.
Faisons un test très 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"
Oui, il est prudent d'utiliser ==
avec NSIndexPath
En remarque, ==
dans Swift est toujours utilisé pour les comparaisons de valeurs. ===
est utilisé pour détecter le moment où deux variables font référence à la même instance. Fait intéressant, le indexPath1 === indexPath2
montre que NSIndexPath est conçu pour partager la même instance chaque fois que les valeurs correspondent, de sorte que même si vous compariez des instances, il serait toujours valide.
Avec Swift, vous pouvez utiliser NSIndexPath
ou IndexPath
. Les deux ont la même stratégie à comparer.
NSIndexPath
Selon la documentation Apple, NSIndexPath
est conforme à Equatable
protocol. Par conséquent, vous pouvez utiliser les opérateurs ==
ou !=
afin de comparer deux instances de NSIndexPath
.
IndexPath
La documentation Apple indique environ NSIndexPath
et IndexPath
:
La superposition rapide de Swift au framework Foundation fournit la structure
IndexPath
, qui établit un pont avec la classeNSIndexPath
.
Cela signifie que vous pouvez utiliser NSIndexPath
comme alternative à IndexPath
, en commençant par Swift 3 et Xcode 8. Notez que IndexPath
est également conforme au protocole Equatable
. Par conséquent, vous pouvez utiliser les opérateurs ==
ou !=
afin de comparer deux instances.