看来我遇到了与 SwiftindexOf
功能不一致的行为。
indexOf
Swift中有两个函数:
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}