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

标签 swift pfobject

我对 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 对象)的子类。我不知道这是否是问题所在。)

最佳答案

因为你的ObjectPFObject的子类,而PFObjectNSObject的子类,所以 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/

相关文章:

ios - Firebase Auth,从不同类获取文本字段值

ios - 尝试使用 pod 相对于 nanopb 安装 Firebase 时出错

arrays - 从 [PFObject] 沮丧?到 [PFObject] 只解包选项,你的意思是使用 "!"

ios - 哪个对象的数组具有最多的特定对象

ios - 详细 View Controller 中的 Segue 错误

ios - 如何使用 SwiftAddressBook 操作 iOS 联系人?

ios - Storyboard "show"segue 在更新到 xcode7 后不起作用(仅在一种情况下)

swift - 仅使用用户的 objectId 检索用户的数据 - Parse & Swift

arrays - 将 PFObject append 到数组,导致所有元素被替换(Swift、Parse)