iphone - ¿Cómo puedo poner objetos en una NSArray en un NSSet?
objective-c cocoa-touch (3)
Versión Swift 3
Puedes crear un nuevo NSSet desde una matriz con:
let mySet = NSSet(array : myArray)
Además, puede agregar objetos de una matriz a un NSMutableSet ya existente con.
myMutableSet = myMutableSet.addingObjects(from: myArray)
Tengo algunos objetos NSDictionary
almacenados en una NSArray
llamada telephoneArray
. Busco los valores para el number
clave y luego sustituyo el NSDictionary
que acabo de leer con un nuevo objeto en el mismo índice en la matriz. Entonces quiero poner estos nuevos objetos en un NSSet
. ¿Cómo se puede lograr esto? Ver mi intento fallido a continuación.
// 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]);
SALIDA:
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
Con el código anterior, telephoneArray puede contar entre 1 y 5, pero telephoneSet siempre tiene un valor de 1. Supongo que hay un error obvio pero no puedo ver dónde.
Esto no es correcto:
NSSet *telephoneSet = [[NSSet alloc] init];
[telephoneSet setByAddingObjectsFromArray:telephoneArray];
Ese método devuelve un NSSet con el que no está haciendo nada (no agrega los objetos a telephoneSet, crea un nuevo NSSet). Haga esto en su lugar:
NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]
Además, tenga en cuenta que un conjunto no puede contener duplicados a diferencia de una matriz. Entonces, si tiene objetos duplicados en su matriz y los pone en un conjunto, los duplicados se eliminarán, lo que puede afectar el conteo de objetos.
Inicialmente telephoneArray
contiene referencias a n
objetos distintos. Una vez que finaliza el bucle, contiene n
referencias, pero cada una apunta al mismo objeto newTelephone
.
La matriz puede contener duplicados, por lo que no importa. Un conjunto no puede tener duplicados, y todo su conjunto de teléfono está compuesto básicamente de un solo objeto, por lo que está viendo solo uno.
En su bucle, debe crear un nuevo objeto u obtener un objeto telefónico desde algún lugar:
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];
}
Además, como dijo PCWiz, no necesita asignar un nuevo objeto NSSet
en su caso. Simplemente llame al método de clase setWithArray:
NSSet *telephoneSet = [NSSet setWithArray:telephoneArray]