web-dev-qa-db-fra.com

Comparer NSIndexPath Swift

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.

24
Shan

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.

49
drewag

Avec Swift, vous pouvez utiliser NSIndexPath ou IndexPath. Les deux ont la même stratégie à comparer.


#1. 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.


# 2. 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 classe NSIndexPath.

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.

0
Imanou Petit