28

If I have a NSIndexPath constant declared for a UITableView, is it valid to compare using the == operator?

This is my constant declaration:

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

And then my function:

 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
}

This certainly works properly, but is it safe to do? I'm assuming that since it works, the == operator on the NSIndexPath object is comparing the section and row properties instead of the instance.

Shan
  • 3,057
  • 4
  • 21
  • 33

2 Answers2

55

Let's do a very simple test:

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"

Yes, it is safe to use == with NSIndexPath

As a side note, == in Swift is always for value comparisons. === is used for detecting when two variables reference the exact same instance. Interestingly, the indexPath1 === indexPath2 shows that NSIndexPath is built to share the same instance whenever the values match, so even if you were comparing instances, it would still be valid.

drewag
  • 93,393
  • 28
  • 139
  • 128
  • 1
    Thanks. Just wanted to be sure. If it had been Objective-C, the `==` operator would have compared the instances? – Shan Aug 07 '14 at 00:58
  • @Shan, that is correct. That is because `==` is actually defined in C. So you are comparing the two pointers in Objective-C (are the two variables pointing to the same place in memory). Swift moved away from C and all classes have to define their own `==` operator. All instances of NSObject use `isEqual:` from Objective-C for `==` comparison – drewag Aug 07 '14 at 01:00
  • I suppose this works too for collection view index paths (which have `item` instead of `row`) – Nicolas Miari Jun 30 '16 at 05:40
1

With Swift, you can use NSIndexPath or IndexPath. Both have the same strategy to compare.


#1. NSIndexPath

According to Apple Documentation, NSIndexPath conforms to Equatable protocol. Therefore, you can use == or != operators in order to compare two instances of NSIndexPath.


#2. IndexPath

Apple documentation states about NSIndexPath and IndexPath:

The Swift overlay to the Foundation framework provides the IndexPath structure, which bridges to the NSIndexPath class.

This means that, as an alternative to NSIndexPath, starting with Swift 3 and Xcode 8, you can use IndexPath. Note that IndexPath also conforms to Equatable protocol. Therefore, you can use == or != operators in order to compare two instances of it.

Imanou Petit
  • 89,880
  • 29
  • 256
  • 218