Преобразование NSArray в NSDictionary

Как преобразовать NSArray в NSDictionary , используя поле int объектов массива в качестве ключа для NSDictionary ?

 - (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]; } 

Попробуйте эту магию:

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

FYI это возможно из-за этой встроенной функции:

 @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; 

Это добавляет расширение категории к NSArray . Требуется режим C99 (который является по умолчанию в эти дни, но на всякий случай).

В файле .h где-нибудь, который может быть #import всеми ..

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

В файле .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 

Пример использования:

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

Выходы:

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

Это пример создания NSMutableDictionary из списка сотрудников 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); 
 - (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; } 

Я создал простую библиотеку под названием Linq to ObjectiveC , которая представляет собой набор методов, облегчающих решение такого рода задач. В вашем случае вам нужен метод Linq-to-ObjectiveC toDictionary , где ваше поле «int» задается с помощью селектора клавиш:

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

Это возвращает словарь, в котором ключи задаются intField в исходном массиве.

  • Если «a == b» является ложным при сравнении двух объектов NSString
  • Ошибка UICollectionView Assertion
  • Как распечатать имя метода и номер строки и условно отключить NSLog?
  • Как использовать performSelector: withObject: afterDelay: с примитивными типами в cocoa?
  • Неверное завершение кода Xcode 6 не работает
  • Прокрутка двумя пальцами с помощью UIScrollView
  • Iphone: как отобразить изображения в каталоге документов в режиме просмотра изображений?
  • Сортировка NSArray строк или объектов даты
  • Создание пользовательского UIKeyBoard для iPhone
  • Одновременные распознаватели жестов в Iphone SDK
  • Программно извлекать использование памяти на iPhone
  • Давайте будем гением компьютера.