Test d'égalité sur une collection d'objets
laurris
Membre
Je voudrais obtenir, dans un NSArray, l'index d'un objet dont une variable est égale à une certaine valeur.
Est-ce qu'il y a un moyen plus simple que de faire une boucle et de tester la variable de chaque objet ?
J'avais bien une idée. J'ai vu dans la doc que indexOfObjet: envoie un isEqual: à chaque objet. Donc je pourrais sous-classer isEqual: mais ça me parait un peu lourd.
Je cherche quelque chose qui serait équivalent à NSSortDescriptor qui permet de comparer avec un @selector perso. Sauf que je veux savoir si les objets sont égaux, pas les trier.
D'avance, merci.
Est-ce qu'il y a un moyen plus simple que de faire une boucle et de tester la variable de chaque objet ?
J'avais bien une idée. J'ai vu dans la doc que indexOfObjet: envoie un isEqual: à chaque objet. Donc je pourrais sous-classer isEqual: mais ça me parait un peu lourd.
Je cherche quelque chose qui serait équivalent à NSSortDescriptor qui permet de comparer avec un @selector perso. Sauf que je veux savoir si les objets sont égaux, pas les trier.
D'avance, merci.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
À partir du moment où tu veux mettre tes objets dans un set ou dans une moindre mesure un array (si tu veux utiliser indexOfObject:, sinon il y a des méthodes similaires qui utilisent l'adresse mémoire (indexOfObjectIdenticalTo: par ex) - mais ça ne convient pas pour tous les cas), tu dois surcharger 2 méthodes: [tt]-(unsigned)hash[/tt] et [tt]-(BOOL)isEqual:(id)object[/tt].
Bon maintenant, si tu veux comparer des variables plutôt que les objets eux-même, 2 possibilités: la première est ne marche qu'à partir de panther, la seconde Tiger.
1. le KVC: valueForKey: sur un array renvoie un tableau contenant les valeurs associées à la clé donnée pour les objets donnés dans le tableau. Et donc à partir de ce tableau tu peux rechercher les index de la valeur que tu recherches. Une fois que tu as les index, tu les appliques au tableau d'origine et tu récupères les objets qui t'intéressent.
2. la classe NSPredicate et [tt]-[NSArray filteredArrayUsingPredicate:][/tt]. See the doc.
Finalement j'ai opté pour une catégorie de NSArray qui compare tous les objets à l'aide d'un selecteur donné. Ca n'élimine pas la boucle mais c'est plus clair: