Array.contains返回false

时间:2015-09-28 12:34:32

标签: ios swift swift2 contains

我有一组名为conversationUsers的用户[User]

用户定义为

public class User: NSManagedObject { ... }

currUser是用户对象

如果我尝试

currUser == conversationUsers[0]

结果 true

但是

conversationUsers.contains(currUser)

结果 false

如果我使用

conversationUsers.contains({$0 == currUser})

返回 true

仅供参考我还定义了这个:

public func ==(lhs: User, rhs: User) -> Bool {

    let logicalExpression = lhs.email.lowercaseString == rhs.email.lowercaseString

    return logicalExpression

}

为什么包含返回false?哪个是他的默认谓词?

感谢您的帮助

1 个答案:

答案 0 :(得分:6)

<强>更新

简而言之,您应该覆盖NSObject.isEqual()方法:

public class User: NSManagedObject { 
    ... 
    override func isEqual(object: AnyObject?) -> Bool {
        if let rhs = object as? User {
            return self == rhs
        }
        return false
    }
}

我做了一点研究。似乎如果类A是从NSObject继承的,那么像contains这样的集合方法会使用NSObject.isEqual()方法来确定两个对象的相等性。类B不是从NSObject继承的,因此contains方法按预期工作。

import Foundation

class A: NSObject {
    var value: Int

    init(_ value: Int) {
        self.value = value
    }
}

func ==(lhs: A, rhs: A) -> Bool {
    return lhs.value == rhs.value
}

var a = A(1)
var array: [A] = [a, A(2)]
array.contains(a) // true
array.contains(A(1)) // false
array.contains { $0 == A(1) } // true
array[0] == A(1) // true


class B: Equatable {
    var value: Int

    init(_ value: Int) {
        self.value = value
    }
}

func ==(lhs: B, rhs: B) -> Bool {
    return lhs.value == rhs.value
}

var b = B(1)
var array2: [B] = [b, B(2)]
array2.contains(b) // true
array2.contains(B(1)) // true
array2.contains { $0 == B(1) } // true
array2[0] == B(1) // true

因此您需要覆盖NSObject.isEqual()方法:

class A: NSObject {
    var value: Int

    init(_ value: Int) {
        self.value = value
    }

    override func isEqual(object: AnyObject?) -> Bool {
        if let rhs = object as? A {
            return self == rhs
        }
        return false
    }
}

OLD ANSWER

User类也应符合Equatable协议:

extension User: Equatable {}

或者您可以直接将其添加到类定义中:

public class User: NSManagedObject, Equatable {}