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ù.
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.
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]
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)