Поиск без учета регистра в NSMutableDictionary - PullRequest
5 голосов
/ 26 мая 2011

Привет, у меня NSMutableDicitionary содержит как строчные, так и прописные ключи.Так что в настоящее время я не знаю, как найти ключ в словаре независимо от ключа, используя цель c.

Ответы [ 4 ]

5 голосов
/ 27 августа 2012

Категории на помощь.Итак, это старый пост ...

@interface NSDictionary (caseINsensitive)
-(id) objectForCaseInsensitiveKey:(id)aKey;
@end


@interface NSMutableDictionary (caseINsensitive)
-(void) setObject:(id) obj forCaseInsensitiveKey:(id)aKey ;
@end


@implementation NSDictionary (caseINsensitive)

-(id) objectForCaseInsensitiveKey:(id)aKey {
    for (NSString *key in self.allKeys) {
        if ([key compare:aKey options:NSCaseInsensitiveSearch] == NSOrderedSame) {
            return [self objectForKey:key];
        }
    }
    return  nil;
}
@end


@implementation NSMutableDictionary (caseINsensitive)

-(void) setObject:(id) obj forCaseInsensitiveKey:(id)aKey {
    for (NSString *key in self.allKeys) {
        if ([key compare:aKey options:NSCaseInsensitiveSearch] == NSOrderedSame) {
            [self setObject:obj forKey:key];
            return;
        }
    }
    [self setObject:obj forKey:aKey];
}

@end

наслаждайтесь.

4 голосов
/ 26 мая 2011

У вас есть контроль над созданием ключей? Если вы это сделаете, я просто заставлю ключи в нижнем или верхнем регистре при их создании. Таким образом, когда вам нужно что-то найти, вам не нужно беспокоиться о ключах со смешанным регистром.

2 голосов
/ 26 мая 2011

Вы можете сделать это, чтобы получить объект как альтернативу подклассам.

__block id object;
[dictionary enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent 
                                    UsingBlock:^(id key, id obj, BOOL *stop){
    if ( [key isKindOfClass:[NSString class]] ) {
        if ( [(NSString*)key caseInsensitiveCompare:aString] == NSOrderedSame ) {
            object = obj; // retain if wish to.
            *stop = YES;
        }            
    }
}];

Вы можете использовать сокращение #define, если вы часто делаете это в своем коде.

1 голос
/ 26 мая 2011

Не думай, что есть какой-то простой способ.Лучшим вариантом может быть создание подкласса NSMutableDictionary и переопределение методов objectForKey и setObject:ForKey.Затем в ваших переопределенных методах убедитесь, что все ключи преобразованы в нижний регистр (или верхний регистр), прежде чем передавать их метадодам суперкласса.

Должно работать что-то вроде следующего:

...