我似乎面临与Swift的indexOf
功能不一致的行为。
Swift中有两个indexOf
函数:
1.第一个以Equatable
为参数:array.indexOf(obj)
2.第二个将匹配闭包作为参数:array.indexOf{$0 == obj}
我有一个NSObject
子类,其中定义了==
运算符,即它符合Equatable
,因此,我假设两个函数完全相同(在示例中使用闭包)
但是,1st
方法的行为不一致,特别是在使用object调用时返回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
的{{1}}方法,而不是我的重载NSObject
运算符。
我的解决方案:
我使用==
答案 0 :(得分:0)
首先,根据这个定义,我得到了不同的结果
class Obj: NSObject {
let value: Int
init(value:Int) {
self.value = value
}
}
func ==(lhs: Obj, rhs: Obj) -> Bool{
return lhs.value == rhs.value
}
var array = [Obj(value: 1), Obj(value: 3), Obj(value: 5)]
var object = Obj(value: 5)
这里是
您可以在下面阅读每个结果后的原因
array.indexOf(object) // nil
在这种情况下,使用isEqual方法,因此您只是比较内存地址。由于
object
var引用了数组中的对象 NOT ,因此结果为nil
array.indexOf(array.last!) // 2
再次使用
isEqual
。但是在这里,您将向indexOf
传递对数组中最后一个对象的引用,以便它可以工作。
array.indexOf { $0 == object } // 2
在此明确使用您定义的
==
运算符,以便使用value
属性。
array.filter { $0 == object } // [{NSObject, value 5}]
再次使用
==
运算符,然后使用value
属性检查是否相等。