arrays - docs - Swift Array.contains() no llama a la función Equatable de la subclase PFUser
docs parse platform (1)
Esta pregunta ya tiene una respuesta aquí:
Tengo una subclase de PFUser - clase MYUser con implementación de la función Equatable para comparar objectIds de esta manera:
func ==(left: MYUser, right: MYUser) -> Bool {
return left.objectId == right.objectId
}
Pero cuando llamo al método Array.contains () no llama a esta implementación de la función Equatable , que conduce a resultados incorrectos. Por ejemplo, aquí:
let hasUser = self.selectedUsers.contains(currentUser)
hasUser se convierte en falso si el array selectedUsers contiene diferentes objetos de memoria pero con el mismo objectId que en currentUser .
Qué implementación de función interesante, Equatable se llama en uso directo. Aquí:
var hasUser = false
for itUser in self.selectedUsers {
if itUser == currentUser {
hasUser = true
break
}
}
== operador fue llamado con éxito y hasUser tiene valores correctos para diferentes objetos de memoria pero con el mismo objectId
¿Cuál puede ser la causa de esto?
ACTUALIZAR. Aquí está la clase MYUser:
class MYUser: PFUser {
// MARK: - Parse Object
@NSManaged var avatarFile: PFFile?
@NSManaged var fullName: String?
// MARK: - PFSubclassing Methods (through PFUser)
override class func initialize() {
struct Static {
static var onceToken : dispatch_once_t = 0;
}
dispatch_once(&Static.onceToken) {
self.registerSubclass()
}
}
}
func ==(left: MYUser, right: MYUser) -> Bool {
return left.objectId == right.objectId
}
Creo que este es un problema de NSObject
.
class MYUserNSObject: NSObject {
dynamic var fullName: String
init(fullName: String) {
self.fullName = fullName
super.init()
}
}
func ==(left: MYUserNSObject, right: MYUserNSObject) -> Bool {
return left.fullName == right.fullName
}
let objectUsers = [MYUserNSObject(fullName: "a"), MYUserNSObject(fullName: "b")]
let objectResult = objectUsers.contains(MYUserNSObject(fullName: "a"))
print("/(result)")
Imprime falso.
class MYUserSwift: Equatable {
var fullName: String
init(fullName: String) {
self.fullName = fullName
}
}
func ==(left: MYUserSwift, right: MYUserSwift) -> Bool {
return left.fullName == right.fullName
}
let swiftUsers = [MYUserSwift(fullName: "a"), MYUserSwift(fullName: "b")]
let swiftResult = swiftUsers.contains(MYUserSwift(fullName: "a"))
print("/(swiftResult)")
Imprime verdadero.
Finalmente, al agregar -isEqual:
arreglé esto.
class MYUserNSObject: NSObject {
dynamic var fullName: String
init(fullName: String) {
self.fullName = fullName
super.init()
}
override func isEqual(object: AnyObject?) -> Bool {
guard let user = object as? MYUserNSObject else { return false }
return self == user
}
}
func ==(left: MYUserNSObject, right: MYUserNSObject) -> Bool {
return left.fullName == right.fullName
}
let objectUsers = [MYUserNSObject(fullName: "a"), MYUserNSObject(fullName: "b")]
let objectResult = objectUsers.contains(MYUserNSObject(fullName: "a"))
print("/(objectResult)")
Imprime verdadero.