iphone objective-c cocoa-touch nsarray nsset

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]