如果我为UITableView声明了一个NSIndexPath常量,那么使用==
运算符进行比较是否有效?
这是我的不变声明:
let DepartureDatePickerIndexPath = NSIndexPath(forRow: 2, inSection: 0)
然后我的功能:
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
}
这当然可以正常使用,但这样做是否安全?我假设因为它工作,NSIndexPath对象上的==
运算符正在比较section和row属性而不是实例。
答案 0 :(得分:49)
让我们做一个非常简单的测试:
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"
是的,将==
与NSIndexPath
作为旁注,Swift中的==
总是用于价值比较。 ===
用于检测两个变量何时引用完全相同的实例。有趣的是,indexPath1 === indexPath2
表明NSIndexPath是为了在值匹配时共享同一个实例而构建的,所以即使您在比较实例,它仍然有效。
答案 1 :(得分:0)
使用Swift,您可以使用NSIndexPath
或IndexPath
。两者都有相同的策略进行比较。
NSIndexPath
根据Apple文档,NSIndexPath
符合Equatable
协议。因此,您可以使用==
或!=
运算符来比较NSIndexPath
的两个实例。
IndexPath
Apple文档说明了NSIndexPath
和IndexPath
:
Swift覆盖到Foundation框架提供了
IndexPath
结构,该结构与NSIndexPath
类桥接。
这意味着,作为NSIndexPath
的替代方案,从Swift 3和Xcode 8开始,您可以使用IndexPath
。请注意,IndexPath
也符合Equatable
协议。因此,您可以使用==
或!=
运算符来比较它的两个实例。