2013-01-16 7 views
14

Devo verificare se un certo array contiene un determinato oggetto e, in tal caso, eliminare quell'oggetto. Se non ha ottenuto quell'oggetto, la funzione si trova in posizione per aggiungerla all'array. Il problema è che l'oggetto viene sempre aggiunto perché l'istruzione di controllo restituisce sempre false.Verifica se un array contiene un determinato oggetto (iOS)

Ecco la mia funzione attuale:

- (void) myFunction:(NSString *)parameter { 

    if (![myMutableArray containsObject:parameter]) { 

     [myMutableArray addObject:parameter]; 
     NSLog(@"%@ added", parameter); 

    } else { 

     [myMutableArray removeObject:parameter]; 
     NSLog(@"%@ deleted", parameter); 

    } 
} 
+1

Ho il sospetto che stanno avendo lo stesso problema come è stato risolto in questa domanda: http://stackoverflow.com/questions/2941596/nsarray-containobjects-method –

+0

è l'array puramente una matrice di oggetti NSString? –

+0

Cosa succede se chiami due volte il tuo metodo con lo stesso parametro? –

risposta

30

containsObject chiede IsEqual su ogni dell'oggetto negli array. Che tipo di oggetto stai controllando? Se si tratta di un oggetto personalizzato, eseguire l'override e implementare il metodo isEqual.

Suppongo che tu stia cercando di verificare il valore dell'oggetto, ma containsObject sta effettivamente chiamando isEqual che sta confrontando il riferimento all'oggetto e non il suo valore effettivo.

2

Si dovrebbe implementare isEqual: nella classe personalizzata. Di default due oggetti sono identici solo se condividono lo stesso riferimento.

Assicurati inoltre di inizializzare l'array mutabile prima di utilizzarlo.

EDIT:

Sembra che il nome della variabile del vostro array sono molto probabilmente un errore di battitura.

  • myMutableArray
  • myMutbaleArray
+1

Ovviamente, la sua "classe personalizzata" è presumibilmente una NSString. –

+0

Non è una classe personalizzata, è una NSString – mprivat

1

Probabilmente dimenticato di inizializzare il NSMutableArray. Se non inizializzato, si inviano messaggi a un addObject oggetto nil, che non ha alcun effetto, e la matrice non contiene ciò che è stato precedentemente aggiunto ...

Naturalmente, se la matrice è nil, allora il controllo sarà sempre contains restituisce falso. Secondo la documentazione Objective-C:

Se il metodo restituisce un oggetto, qualsiasi tipo di puntatore, qualsiasi numero intero scalare di dimensione inferiore o uguale a sizeof (void *), un galleggiante, un letto, un lungo doppio, o un lungo lungo, poi un messaggio inviato a nil restituisce 0.

e 0 è falso

7

Per prima cosa è necessario verificare quale tipo di dati o oggetto si sta aggiungendo in questo myMutableArray. In base al tuo metodo, stai verificando l'array mutabile per il tipo di stringa che hai passato l'argomento parameter. Potrebbe essere possibile che tu stia utilizzando int o float array.

Potrebbe esserci un problema di tipo casting nell'array. Se il tuo è un tipo di dati STRING, puoi utilizzare un altro metodo come questo.

- (void) myFunction:(NSString *)parameter { 

for (int i = 0 ; i < [myMutableArray count ] ; i++) { 


    if (![[myMutableArray objectAtIndex:i] isEqualToString:parameter]) { 
     [myMutableArray addObject:parameter]; 
     NSLog(@"%@ added", parameter); 
    } 
    else{ 
     [myMutableArray removeObject:parameter]; 
     NSLog(@"%@ deleted", parameter); 
    } 
} 

}

Spero che questo vi aiuterà. Se il tuo oggetto non è un tipo di NSString, allora devi convertire.

+0

Mi ha aiutato molto, grazie nirav –

16
if (![arrList containsObject:arrObj]) { 
    // do something 
} 

containsObject: