Swift indexOf,==操作符覆盖未被调用

时间:2016-04-07 15:34:42

标签: swift pfobject

我对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对象)。我不知道这是不是搞乱了。)

3 个答案:

答案 0 :(得分:3)

由于您的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 { $0 == c }
print(index) // Optional(2)
print(index2) // Optional(2)

答案 1 :(得分:0)

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

  

如果找不到值,则返回valueself中显示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
}