NSMutableDictionary中的Case Insensitive Search

时间:2011-05-26 07:14:05

标签: ios iphone objective-c full-text-search nsmutabledictionary

HI,我有一个NSMutableDicitionary包含小写和大写键。所以目前我不知道如何使用目标c找到字典中的密钥而不管密钥。

4 个答案:

答案 0 :(得分:5)

救援类别。 好的,所以这是一个老帖子......

@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

享受。

答案 1 :(得分:4)

您是否可以控制密钥的创建?如果你这样做,我只是在创建它们时强制键为小写或大写。这样,当您需要查找某些内容时,您不必担心混合大小写密钥。

答案 2 :(得分:2)

您可以这样做以将对象作为子类化的替代方法。

__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速记。

答案 3 :(得分:1)

不要认为有任何简单的方法。您最好的选择可能是创建NSMutableDictionary的子类,并覆盖objectForKeysetObject:ForKey方法。然后在重写的方法中确保所有键都转换为小写(或大写),然后再将它们传递给超类methdods。

以下内容应该有效:

@Interface CaseInsensitveMutableDictionary : MutableDictionary {}
@end

@implementation CaseInsensitveMutableDictionary
    - (void) setObject: (id) anObject forKey: (id) aKey {
       [super setObject:anObject forKey:[skey lowercaseString]];
    }

    - (id) objectForKey: (id) aKey {
       return [super objectForKey: [aKey lowercaseString]];
    }
@end