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.
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 !=
Swift version: 5.6. Index paths describe an item's position inside a table view or collection view, storing both its section and its position inside that section.
Index path is generally a set of two values representing row and section of a table view. Index path can be created in objective C as well as Swift as both are native language of iOS Development. IndexPathForRow is a class method in iOS.
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.
NSIndexPath
According to Apple Documentation, NSIndexPath
conforms to Equatable
protocol. Therefore, you can use ==
or !=
operators in order to compare two instances of NSIndexPath
.
IndexPath
Apple documentation states about NSIndexPath
and IndexPath
:
The Swift overlay to the Foundation framework provides the
IndexPath
structure, which bridges to theNSIndexPath
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With