parse docs arrays swift parse.com pfuser

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.