Array.contains returns 错误
Array.contains returns false
我有一个名为 conversationUsers
的用户数组 [User]
用户定义为
public class User: NSManagedObject { ... }
并且currUser
是一个用户对象
如果我尝试
currUser == conversationUsers[0]
结果正确
但是
conversationUsers.contains(currUser)
结果错误
如果我改用
conversationUsers.contains({[=15=] == currUser})
是returns是
仅供参考,我也定义了这个:
public func ==(lhs: User, rhs: User) -> Bool {
let logicalExpression = lhs.email.lowercaseString == rhs.email.lowercaseString
return logicalExpression
}
为什么包含 returns 错误?他的默认谓词是哪个?
感谢您的帮助
更新
简而言之,您应该覆盖 NSObject.isEqual()
方法:
public class User: NSManagedObject {
...
override func isEqual(object: AnyObject?) -> Bool {
if let rhs = object as? User {
return self == rhs
}
return false
}
}
我做了一点研究。似乎如果 class A
是从 NSObject
继承的,那么像 contains
这样的集合方法使用 NSObject.isEqual()
方法来确定两个对象的相等性。 Class 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 { [=11=] == 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 { [=11=] == 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
}
}
旧答案
User
class 也应该符合 Equatable
协议:
extension User: Equatable {}
或者直接添加到class定义中:
public class User: NSManagedObject, Equatable {}
我有一个名为 conversationUsers
的用户数组[User]
用户定义为
public class User: NSManagedObject { ... }
并且currUser
是一个用户对象
如果我尝试
currUser == conversationUsers[0]
结果正确
但是
conversationUsers.contains(currUser)
结果错误
如果我改用
conversationUsers.contains({[=15=] == currUser})
是returns是
仅供参考,我也定义了这个:
public func ==(lhs: User, rhs: User) -> Bool {
let logicalExpression = lhs.email.lowercaseString == rhs.email.lowercaseString
return logicalExpression
}
为什么包含 returns 错误?他的默认谓词是哪个?
感谢您的帮助
更新
简而言之,您应该覆盖 NSObject.isEqual()
方法:
public class User: NSManagedObject {
...
override func isEqual(object: AnyObject?) -> Bool {
if let rhs = object as? User {
return self == rhs
}
return false
}
}
我做了一点研究。似乎如果 class A
是从 NSObject
继承的,那么像 contains
这样的集合方法使用 NSObject.isEqual()
方法来确定两个对象的相等性。 Class 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 { [=11=] == 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 { [=11=] == 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
}
}
旧答案
User
class 也应该符合 Equatable
协议:
extension User: Equatable {}
或者直接添加到class定义中:
public class User: NSManagedObject, Equatable {}