iphone objective-c nsarray nsdictionary

iphone - Convertir NSArray a NSDictionary



objective-c (6)

Este es un ejemplo de NSMutableDictionary crear un NSMutableDictionary desde la lista de empleados NSMutableArray :

NSMutableArray *emloyees = [[NSMutableArray alloc]initWithObjects:@"saman",@"Ruchira",@"Rukshan",@"ishan",@"Harsha",@"Ghihan",@"Lakmali",@"Dasuni", nil]; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; for (NSString *word in emloyees) { NSString *firstLetter = [[word substringToIndex:1] uppercaseString]; letterList = [dict objectForKey:firstLetter]; if (!letterList) { letterList = [NSMutableArray array]; [dict setObject:letterList forKey:firstLetter]; } [letterList addObject:word];} NSLog(@"dic %@",dict);

¿Cómo puedo convertir una NSArray en un NSDictionary , usando un campo int de los objetos de la matriz como clave para el NSDictionary ?


Esto agrega una extensión de categoría a NSArray . Necesita el modo C99 (que es el predeterminado en estos días, pero por si acaso).

En un archivo .h algún lugar que pueda #import por todos ..

@interface NSArray (indexKeyedDictionaryExtension) - (NSDictionary *)indexKeyedDictionary @end

En un archivo .m ...

@implementation NSArray (indexKeyedDictionaryExtension) - (NSDictionary *)indexKeyedDictionary { NSUInteger arrayCount = [self count]; id arrayObjects[arrayCount], objectKeys[arrayCount]; [self getObjects:arrayObjects range:NSMakeRange(0UL, arrayCount)]; for(NSUInteger index = 0UL; index < arrayCount; index++) { objectKeys[index] = [NSNumber numberWithUnsignedInteger:index]; } return([NSDictionary dictionaryWithObjects:arrayObjects forKeys:objectKeys count:arrayCount]); } @end

Ejemplo de uso:

NSArray *array = [NSArray arrayWithObjects:@"zero", @"one", @"two", NULL]; NSDictionary *dictionary = [array indexKeyedDictionary]; NSLog(@"dictionary: %@", dictionary);

Salidas:

2009-09-12 08:41:53.128 test[66757:903] dictionary: { 0 = zero; 1 = one; 2 = two; }


He creado una biblioteca simple, llamada Linq to ObjectiveC , que es una colección de métodos que hacen que este tipo de problema sea mucho más fácil de resolver. En su caso, necesita el método Linq-to-ObjectiveC toDictionary , donde su campo ''int'' se especifica a través de un selector de teclas:

NSDictionary* dictionary = [sourceArray toDictionaryWithKeySelector:^id(id item) { return [item intField]; }];

Esto devuelve un diccionario donde las claves son dadas por intField en la matriz de origen.


Prueba esta magia:

NSDictionary *dict = [NSDictionary dictionaryWithObjects:records forKeys:[records valueForKey:@"intField"]];

Para su información, esto es posible debido a esta característica incorporada:

@interface NSArray(NSKeyValueCoding) /* Return an array containing the results of invoking -valueForKey: on each of the receiver''s elements. The returned array will contain NSNull elements for each instance of -valueForKey: returning nil. */ - (id)valueForKey:(NSString *)key;


- (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array { NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init]; [array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop){ NSNumber *index = [NSNumber numberWithInteger:idx]; [mutableDictionary setObject:obj forKey:index]; }]; NSDictionary *result = [NSDictionary.alloc initWithDictionary:mutableDictionary]; return result; }


- (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array { id objectInstance; NSUInteger indexKey = 0U; NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init]; for (objectInstance in array) [mutableDictionary setObject:objectInstance forKey:[NSNumber numberWithUnsignedInt:indexKey++]]; return (NSDictionary *)[mutableDictionary autorelease]; }