Test d'égalité sur une collection d'objets

laurrislaurris Membre
00:24 modifié dans API AppKit #1
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.



Réponses

  • 00:24 modifié #2
    dans 1173381435:

    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.


    À 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.
  • laurrislaurris Membre
    mars 2007 modifié #3
    Merci. Le KVC est surement la bonne solution. Sauf que ... je compare les objets entre eux avec des variables différentes selon les objets. J'aurais dû le préciser plus tôt.

    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:

    <br />@implementation NSArray (Additions)<br /><br />-(int)indexOfObject:(id)object selector:(SEL)selector{<br />	int i;<br />	int index = NSNotFound;<br />	for (i=0; i&lt;[self count]; i++) {<br />		id objectInArray= [self objectAtIndex:i];<br />		if([objectInArray performSelector:selector withObject:object]){<br />			index=i;break;<br />		}	<br />	}<br />	return index;<br />}<br /><br />@end<br /><br />
    
Connectez-vous ou Inscrivez-vous pour répondre.