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.
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.
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
IndexPathstructure, which bridges to theNSIndexPathclass.
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.
来源:https://stackoverflow.com/questions/25172525/comparing-nsindexpath-swift