gpt4 book ai didi

ios - Array.contains 返回 false

转载 作者:搜寻专家 更新时间:2023-10-31 22:07:27 26 4
gpt4 key购买 nike

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

用户定义为

public class User: NSManagedObject { ... }

并且currUser是一个User对象

如果我尝试

currUser == conversationUsers[0]

结果正确

但是

conversationUsers.contains(currUser)

结果

如果我改用

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

它返回

仅供引用,我还定义了这个:

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

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

return logicalExpression

}

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

谢谢你的帮助

最佳答案

更新

简而言之,您应该覆盖 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
}
}

旧答案

User 类也应该符合 Equatable 协议(protocol):

extension User: Equatable {}

或者你可以直接将它添加到类定义中:

public class User: NSManagedObject, Equatable {}

关于ios - Array.contains 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32823122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com