HI,我有一个NSMutableDicitionary包含小写和大写键。所以目前我不知道如何使用目标c找到字典中的密钥而不管密钥。
答案 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
的子类,并覆盖objectForKey
和setObject: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