看来我遇到了与 SwiftindexOf功能不一致的行为。
indexOfSwift中有两个函数:
1. 第一个Equatable作为参数:array.indexOf(obj)
2. 第二个将匹配的闭包作为参数:array.indexOf{$0 == obj}
我有一个定义了运算符的NSObject子类==,即它符合Equatable,因此,我假设两个函数的工作方式完全相同(在示例中使用闭包)。
但是,该1st方法的行为不一致,特别是nil在使用对象调用时返回,该对象的实例不存在于数组中。
为了说明问题,我提供了带有注释的示例代码:
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)调用isEqual方法NSObject而不是我的重载==运算符。
我的解决方案:
我使用array.indexOf{$0 == object}
