Comment puis-je convertir un NSArray
à un NSDictionary
en utilisant un champ de type int des objets du tableau comme clé pour l'analyse des données. NSDictionary
?
Réponses
Trop de publicités?Essayez cette magie :
NSDictionary* dict = [NSDictionary dictionaryWithObjects:records
forKeys:[records valueForKey:@"title"]];
Pour votre information, cela est possible grâce à cette fonctionnalité intégrée :
@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
{
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];
}
Cela ajoute une extension de catégorie à NSArray
. Besoins C99
(qui est le mode par défaut de nos jours, mais juste au cas où).
Dans un .h
quelque part qui peut être #import
par tous.
@interface NSArray (indexKeyedDictionaryExtension)
- (NSDictionary *)indexKeyedDictionary
@end
Dans un .m
fichier..
@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
Exemple d'utilisation :
NSArray *array = [NSArray arrayWithObjects:@"zero", @"one", @"two", NULL];
NSDictionary *dictionary = [array indexKeyedDictionary];
NSLog(@"dictionary: %@", dictionary);
Sorties :
2009-09-12 08:41:53.128 test[66757:903] dictionary: {
0 = zero;
1 = one;
2 = two;
}
- (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;
}
J'ai créé une bibliothèque simple, appelée Linq à ObjectiveC qui est un ensemble de méthodes permettant de résoudre ce type de problème plus facilement. Dans votre cas, vous avez besoin de la méthode Dictionnaire Linq-to-ObjectiveC toDictionary où votre champ "int" est spécifié par un sélecteur de clé :
NSDictionary* dictionary = [sourceArray toDictionaryWithKeySelector:^id(id item) {
return [item intField];
}];
Cela renvoie un dictionnaire dont les clés sont données par l'option intField
dans le tableau source.