Hallo, ich habe ein NSMutableDicitionary, das sowohl Kleinbuchstaben als auch Großbuchstaben enthält. Aktuell weiß ich nicht, wie ich den Schlüssel im Wörterbuch unabhängig vom Schlüssel mit Objective C finden kann.
Antworten
Zu viele Anzeigen?Kategorien in der Rettung. Ok, also ist es ein alter Beitrag...
@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
genießen.
Sie können dies tun, um das Objekt als Alternative zur Subclassing zu erhalten.
__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;
}
}
}];
Sie können eine #define
Verkürzung verwenden, wenn Sie dies in Ihrem Code häufig tun.
Denke nicht, dass es einen einfachen Weg gibt. Deine beste Option könnte sein, eine Unterklasse von NSMutableDictionary
zu erstellen und die Methoden objectForKey
und setObject:ForKey
zu überschreiben. Dann stellen Sie in Ihren überschriebenen Methoden sicher, dass alle Schlüssel in Kleinbuchstaben (oder Großbuchstaben) konvertiert werden, bevor sie an die übergeordneten Methoden übergeben werden.
Etwas in der Art des folgenden sollte funktionieren:
@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