我对Swift如何处理平等感到沮丧。或者我只是遗漏了一些东西。为什么这两个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中没有调用== override。为什么会这样?这感觉非常危险。
(MyObject是PFObject的子类(Parse.com对象)。我不知道这是不是搞乱了。)
答案 0 :(得分:3)
由于您的Object
是PFObject
的子类,PFObject
是NSObject
的子类,NSObject
已通过使用确认Equatable
要实现的isEqual
方法。所以你的==运算符覆盖不起作用。您应该覆盖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)
答案 1 :(得分:0)
您正在使用的第二个indexOf
方法允许您定义一个闭包以指示对象相等(就像您已经完成的那样)。第一个根据文档:
如果找不到值,则返回
value
或self
中显示nil
的第一个索引。
其中value
是您要传递的对象作为参数。如果没有看到这个版本的实现,我只能假设他们比较两个对象在各方面是否相等(所有属性都匹配)。所以在你的情况下,如果你只考虑someProperty
匹配的对象,那么你应该使用闭包运算符的闭包方法。
答案 2 :(得分:0)
static func == (left: MyClass, right: MyClass) -> Bool {
return left.attribute1 == right.attribute1
}
override func isEqual(_ object: Any?) -> Bool {
guard let right = object as? MyClass else {
return false
}
// call the == from above
// why couldn't apple do this ???
//
return self == right
}