Gio*_*zzi 3 contains ios swift swift2
我有一组[User]叫做conversationUsers 的用户
用户定义为
public class User: NSManagedObject { ... }
Run Code Online (Sandbox Code Playgroud)
并且currUser是一个User对象
如果我试试
currUser == conversationUsers[0]
Run Code Online (Sandbox Code Playgroud)
结果是真的
但
conversationUsers.contains(currUser)
Run Code Online (Sandbox Code Playgroud)
结果错了
相反,我使用
conversationUsers.contains({$0 == currUser})
Run Code Online (Sandbox Code Playgroud)
它返回true
仅供参考我还定义了这个:
public func ==(lhs: User, rhs: User) -> Bool {
let logicalExpression = lhs.email.lowercaseString == rhs.email.lowercaseString
return logicalExpression
}
Run Code Online (Sandbox Code Playgroud)
为什么包含返回false?这是他的默认谓词?
谢谢您的帮助
UPDATE
简而言之,您应该覆盖NSObject.isEqual()方法:
public class User: NSManagedObject {
...
override func isEqual(object: AnyObject?) -> Bool {
if let rhs = object as? User {
return self == rhs
}
return false
}
}
Run Code Online (Sandbox Code Playgroud)
我做了一点研究.似乎如果类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
Run Code Online (Sandbox Code Playgroud)
所以你需要覆盖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
}
}
Run Code Online (Sandbox Code Playgroud)
老答复
User类也应符合Equatable协议:
extension User: Equatable {}
Run Code Online (Sandbox Code Playgroud)
或者您可以将其直接添加到类定义中:
public class User: NSManagedObject, Equatable {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2004 次 |
| 最近记录: |