web-dev-qa-db-fra.com

Comment placer des objets dans un NSArray dans un NSSet?

J'ai quelques NSDictionary objets stockés dans un NSArray appelé telephoneArray. Je récupère les valeurs de la clé number puis je remplace le NSDictionary que je viens de lire avec un nouvel objet au même index dans le tableau. Je veux ensuite mettre ces nouveaux objets dans un NSSet. Comment cela peut il etre accompli? Voir ma tentative infructueuse ci-dessous.

    // Add all telephones to this branch
    for (int i=0; i<[telephoneArray count]; i++) {

        [newTelephone setBranch:newBranch];
        [newTelephone setNumber:[[telephoneArray objectAtIndex:i] valueForKey:@"number"]];

        NSLog(@"%@",[[telephoneArray objectAtIndex:i] valueForKey:@"number"]);
        [telephoneArray replaceObjectAtIndex:i withObject:newTelephone];
        NSLog(@"phone number %i = %@",i,[[telephoneArray objectAtIndex:i] valueForKey:@"number"]);

    }

    NSSet *telephoneSet = [NSSet setWithArray:telephoneArray];

    NSLog(@"telephoneArray=%i",[telephoneArray count]);
    NSLog(@"telephoneSet=%i",[[telephoneSet allObjects] count]);

PRODUCTION:

2010-03-06 03:06:02.824 AIB[5160:6507] 063 81207
2010-03-06 03:06:02.824 AIB[5160:6507] phone number 0 = 063 81207
2010-03-06 03:06:02.825 AIB[5160:6507] 063 81624
2010-03-06 03:06:02.825 AIB[5160:6507] phone number 1 = 063 81624
2010-03-06 03:06:02.825 AIB[5160:6507] 063 81714
2010-03-06 03:06:02.826 AIB[5160:6507] phone number 2 = 063 81714
2010-03-06 03:06:02.826 AIB[5160:6507] 063 81715
2010-03-06 03:06:02.826 AIB[5160:6507] phone number 3 = 063 81715
2010-03-06 03:06:02.826 AIB[5160:6507] telephoneArray=4
2010-03-06 03:06:02.827 AIB[5160:6507] telephoneSet=1

Avec le code ci-dessus, telephoneArray peut avoir un nombre compris entre 1 et 5 mais telephoneSet a toujours une valeur de 1. Je suppose qu'il y a une erreur évidente mais je ne vois pas où.

26
conorgriffin

Ce n'est pas correct:

NSSet *telephoneSet = [[NSSet alloc] init];
[telephoneSet setByAddingObjectsFromArray:telephoneArray];

Cette méthode renvoie un NSSet avec lequel vous ne faites rien (elle n'ajoute pas les objets à telephoneSet, elle crée un nouveau NSSet). Faites ceci à la place:

NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]

Notez également qu'un ensemble ne peut pas contenir de doublons contrairement à un tableau. Donc, si vous avez des objets en double dans votre tableau et que vous les placez dans un ensemble, les doublons seront supprimés, ce qui peut affecter le nombre d'objets.

93
indragie

Initialement, telephoneArray contient des références à n objets distincts. Une fois la boucle terminée, elle contient des références n, mais chacune pointe vers le même objet newTelephone.

Un tableau peut contenir des doublons, donc cela n'a pas d'importance. Un ensemble ne peut pas avoir de doublons, et votre tableau de téléphone entier est composé d'un seul objet, donc vous n'en voyez qu'un.

Dans votre boucle, vous devez créer un nouvel objet ou obtenir un objet téléphonique quelque part:

for (int i=0; i<[telephoneArray count]; i++) {
    // Create the new object first, or get it from somewhere.
    Telephone *newTelephone = [[Telephone alloc] init];
    [newTelephone setBranch:newBranch];
    [newTelephone setNumber:[[telephoneArray objectAtIndex:i] valueForKey:@"number"]];
    [telephoneArray replaceObjectAtIndex:i withObject:newTelephone];
    // the array holds a reference, so you could let go of newTelephone
    [newTelephone release];
}

De plus, comme l'a dit PCWiz, vous n'avez pas besoin d'allouer un nouvel objet NSSet dans votre cas. Appelez simplement la méthode de classe setWithArray:.

NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]
11
Anurag

Version Swift 3

Vous pouvez créer un nouveau NSSet à partir d'un tableau avec:

let mySet = NSSet(array : myArray)

De plus, vous pouvez ajouter des objets d'un tableau à un NSMutableSet déjà existant avec.

myMutableSet =  myMutableSet.addingObjects(from: myArray)
2
Kyle Somers