Swift indexOf,== 运算符覆盖未被调用

Swift indexOf, == operator override not getting called

我对 Swift 处理平等的方式感到沮丧。或者我只是错过了一些东西。为什么这 2 indexOf 的工作方式不同?

let first = self.objects.indexOf(object) //This returns nil
let second = self.objects.indexOf{[=11=] == object} //This returns the index

我的 == 覆盖:

func ==(lhs: MyObject, rhs: MyObject) -> Bool {
    return lhs.someProperty == rhs.someProperty
}

第一个 indexOf 中未调用 == 覆盖。为什么?这感觉真的很危险。

(MyObject 是 PFObject(Parse.com 个对象)的子类。我不知道这是否是问题所在。)

您正在使用的第二个 indexOf 方法允许您定义一个闭包来指示对象相等(就像您已经完成的那样)。根据文档的第一个:

Returns the first index where value appears in self or nil if value is not found.

其中 value 是您作为参数传递的对象。在没有看到这个版本的实现的情况下,我只能假设他们比较两个对象是否在各个方面都相等(所有属性都匹配)。因此,在您的情况下,如果您仅在 somePropertys 匹配时才认为对象相等,那么您应该将闭包方法与重载运算符一起使用。

由于您的 ObjectPFObject 的子类,而 PFObjectNSObject 的子类,并且 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 { [=10=] == c }
print(index) // Optional(2)
print(index2) // Optional(2)
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
}