web-dev-qa-db-fra.com

Vérifier si un tableau contient un certain objet (iOS)

J'ai besoin de vérifier si un certain tableau contient un certain objet, et si c'est le cas, supprimez cet objet. S'il n'a pas cet objet, la fonction est supposée l'ajouter dans le tableau. Le problème est que l'objet est toujours ajouté car l'instruction de vérification retourne toujours false.

Voici ma fonction actuelle:

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

    if (![myMutableArray containsObject:parameter]) {

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

    } else {

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

    }
}
15
iosdevrocks

containsObject appelle isEqual sur chacun des objets des tableaux. Quel type d'objet recherchez-vous? S'il s'agit d'un objet personnalisé, remplacez et implémentez la méthode isEqual.

Je suppose que vous essayez de vérifier la valeur de l'objet, mais containsObject appelle en fait isEqual qui compare la référence à l'objet, et non sa valeur réelle.

31
Rohan Agarwal
if (![arrList containsObject:arrObj]) {
    // do something
}

containsObject:

16
Darshit Shah

Vous devez d'abord vérifier le type de données ou l'objet que vous ajoutez dans ce myMutableArray. Selon votre méthode, vous vérifiez dans le tableau mutable le type de chaîne que vous avez passé l'argument parameter. Il est possible que vous conteniez un tableau int ou float.

Il peut y avoir un problème de conversion de type dans votre tableau. Si votre type de données est STRING, vous pouvez utiliser une autre méthode comme celle-ci.

- (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);
    }
}

}

J'espère que cela vous aidera. Si votre objet n'est pas de type NSString, vous devez le convertir.

7
Nirav

Vous devez implémenter isEqual: dans votre classe personnalisée. Par défaut, deux objets ne sont identiques que s'ils partagent la même référence.

Assurez-vous également d'initialiser votre tableau mutable avant de l'utiliser.

MODIFIER :

Il semble que le nom de variable de votre tableau soit très probablement mal tapé.

  • myMutableArray
  • myMutbaleArray
2
Attila H

Vous avez probablement oublié d'initialiser votre NSMutableArray. S'il n'est pas initialisé, vous envoyez des messages addObject à un objet nil, ce qui n'a aucun effet, et le tableau ne contient jamais ce que vous avez ajouté précédemment ...

Bien sûr, si le tableau est nil, la vérification contains renverra toujours false. Selon les documents Objective-C:

Si la méthode renvoie un objet, tout type de pointeur, tout scalaire entier de taille inférieure ou égale à sizeof (void *), un flottant, un double, un long double ou un long long, alors un message envoyé à nil renvoie 0 .

Et 0 est faux

1
mprivat