我对 Swift 处理相等性的方式感到沮丧。或者我只是错过了一些东西。为什么这 2 个 indexOf
的工作方式不同?
let first = self.objects.indexOf(object) //This returns nil
let second = self.objects.indexOf{$0 == object} //This returns the index
我的 == 覆盖:
func ==(lhs: MyObject, rhs: MyObject) -> Bool {
return lhs.someProperty == rhs.someProperty
}
== 覆盖不会在第一个 indexOf 中被调用。为什么会这样?这感觉真的很危险。
(MyObject 是 PFObject(Parse.com 对象)的子类。我不知道这是否是问题所在。)
最佳答案
因为你的Object
是PFObject
的子类,而PFObject
是NSObject
的子类,所以 NSObject
已经通过isEqual
方法实现确认为Equatable
。所以你的 == 运算符覆盖不起作用。您应该覆盖 isEqual
方法。 (老实说,这太可怕了:(
示例代码:
class Object: NSObject {
var value: Int
init(value: Int) {
self.value = value
}
override func isEqual(object: AnyObject?) -> Bool {
guard let obj = object as? Object else { return false }
return self.value == obj.value
}
}
// If your class is not inherit from any ObjC class:
//extension Object: Equatable {}
//func ==(lhs: Object, rhs: Object) -> Bool {
// return lhs.value == rhs.value
//}
let c = Object(value: 3)
let objs = [Object(value: 1), Object(value: 2), Object(value: 3)]
let index = objs.indexOf(c)
let index2 = objs.indexOf { $0 == c }
print(index) // Optional(2)
print(index2) // Optional(2)
关于Swift indexOf,==运算符覆盖未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36480887/