2010-05-31 9 views
16

Ho una semplice domanda riguardante la codifica xcode ma non so perché le cose non stanno funzionando come penso. Ho una matrice di oggetti (oggetti personalizzati). Voglio solo verificare se questo è all'interno dell'array. Ho usato il seguente codice:NSArray containsObject method

NSArray *collection = [[NSArray alloc] initWithObjects:A, B, C, nil]; //A, B, C are custom "Item" objects 
Item *tempItem = [[Item alloc] initWithLength:1 width:2 height:3]; //3 instance variables in "Item" objects 
if([collection containsObject:tempItem]) { 
    NSLog(@"collection contains this item"); 
} 

Suppongo che il controllo di cui sopra mi darà un risultato positivo ma non lo è. Inoltre, ho controllato se gli oggetti creati sono gli stessi.

NSLog(@"L:%i W:%i H:%i", itemToCheck.length, itemToCheck.width, itemToCheck.height); 
for (int i = 0, i < [collection count], i++) { 
    Item *itemInArray = [collection objectAtIndex:i]; 
    NSLog(@"collection contains L:%i W:%i H:%i", itemInArray.length, itemInArray.width, itemInArrayheight); 
} 

Nella console, questo è quello che ho ottenuto:

L:1 W:2 H:3 
collection contains L:0 W:0 H:0 
collection contains L:1 W:2 H:3 
collection contains L:6 W:8 H:2 

Ovviamente il tempItem si trova all'interno della matrice collection ma non appare nulla quando uso containsObject: controllarlo. Qualcuno potrebbe darmi qualche indicazione su quale parte mi sbaglio? Molte grazie!

risposta

40

La documentazione per [NSArray containsObject:] dice:

Questo metodo determina se anObject è presente nel ricevitore inviando un IsEqual: messaggio a ciascuno dei oggetti del ricevitore (e passando anObject come parametro per ogni isEqual: messaggio).

Il problema è che si confrontano i riferimenti agli oggetti piuttosto che i valori degli oggetti. Per fare in modo che questo esempio specifico funzioni, è necessario inviare [collection containsObject:] un'istanza di una variabile che contiene (ad esempio A, B o C), oppure sarà necessario sostituire il metodo [NSObject isEqual:] nella classe Item.

Questo è ciò che il vostro metodo di isEqual potrebbe essere simile:

- (BOOL)isEqual:(id)other { 
    if (other == self) 
     return YES; 
    if (!other || ![other isKindOfClass:[self class]]) 
     return NO; 
    if (self.length != other.length || self.width != other.width || self.height != other.height) 
     return NO; 
    return YES; 
} 

Per una migliore attuazione, si consiglia di guardare a questo question.

+1

Oh, mi dispiace, solo un errore di battitura per "Frutta", dovrebbe essere "Articolo". Intendi confrontare gli oggetti di classe personalizzati con containsObject: non funziona? – Anthony

+2

Funziona, è solo il confronto di default usando un riferimento al tuo oggetto personalizzato. Se vuoi rendere 'tempItem' uguale a' A' nel tuo esempio precedente, dovrai semplicemente creare il metodo 'isEqual' sulla tua classe. – Senseful

+1

@Anthony, pensa in questo modo: come potrebbe 'NSObject', che fornisce il confronto predefinito, sapere come viene definita l'uguaglianza per le tue classi personalizzate? Quali proprietà dovrebbe prendere in considerazione e quali no? –