【发布时间】:2016-08-03 10:52:03
【问题描述】:
我似乎遇到了与 Swift 的 indexOf 函数不一致的行为。
Swift 中有两个indexOf 函数:
1.第一个以Equatable为参数:array.indexOf(obj)
2.第二种以匹配闭包为参数:array.indexOf{$0 == obj}
我有一个 NSObject 子类,为其定义了 == 运算符,即它符合 Equatable,因此,我假设这两个函数的工作方式完全相同(以闭包为例)。
但是,1st 方法的行为不一致,特别是在使用对象调用时它返回 nil,该对象的实例不存在于数组中。
为了说明问题,我提供了带有 cmets 的示例代码:
class EqObj: NSObject {
let value: Int
init(value: Int) {
self.value = value
}
}
func ==(lhs: EqObj, rhs: EqObj) -> Bool{
return lhs.value == rhs.value
}
var array = [Obj(value: 1), Obj(value: 3), Obj(value: 5)]
var object = Obj(value: 5)
// returns nil, should return 2 - incorrect
array.indexOf(object) // Instance is not present
// returns 2, correct
array.indexOf(array.last!) // Instance is present
// returns 2, correct
array.indexOf{$0 == object} // Instance is not present, predicate
// returns non-empty array, correct
array.filter{$0 == object} // Instance is not present, predicate
这个问题只能在 NSObject 子类中重现。当我将 Obj: NSObject 更改为 Obj: Equatable 时,方法 indexOf() 完全按预期工作,即返回 2。
问题是这是否可以被认为是一个错误?
我的假设是array.indexOf(object) 调用NSObject 的isEqual 方法,而不是我重载的== 运算符。
我的解决方案:
我用array.indexOf{$0 == object}
【问题讨论】:
-
Obj是如何定义的? -
为什么你认为 indexOf 应该使用你的重载运算符?这不是错误
-
@Lu_ 因为
indexOf()在Equatable上运行。另一个indexOf{}适用于任何类型并关闭以比较两个实例。 -
@appzYourLife 只是
EqObj: NSObject(不一致的行为)或EqObj: Equatable(预期的行为) -
“我的假设是 array.indexOf(object) 调用了 NSObject 的 isEqual 方法”——确实如此,对于 NSObject 子类。
标签: arrays swift indexof nsobject equatable