6 Stimmen

Groß- und Kleinschreibung bei der Suche in NSMutableDictionary

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.

6voto

unsynchronized Punkte 4729

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.

4voto

csano Punkte 12748

Haben Sie Kontrolle über die Erstellung der Schlüssel? Wenn ja, würde ich die Schlüssel einfach entweder in Klein- oder Großbuchstaben umwandeln, wenn Sie diese erstellen. Auf diese Weise müssen Sie sich bei der Suche nach etwas keine Gedanken über gemischte Groß- und Kleinschreibung machen.

2voto

Deepak Danduprolu Punkte 44474

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.

1voto

Tom Jefferys Punkte 12955

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X