2 Stimmen

Gibt es so etwas wie ein NSSet, das den Abruf nach Hash-Wert ermöglicht?

Ich versuche, ein NSDictionary zu erstellen, das Objekte mit Schlüsseln auf der Grundlage von IDs speichert. Ich weiß, dass ich NSNumber-Objekte verwenden kann, aber warum kann ich stattdessen nicht einfach ein int verwenden? Gibt es eine Klasse, die dies unterstützt? Etwas wie ein NSSet funktioniert fast, außer dass ich nicht über den Hashwert darauf zugreifen kann (ich habe die Klasse - (NSUInteger) hash um die ID des Objekts zurückzugeben, die immer eindeutig ist)

Ich versuche im Grunde, das zu drehen:

//objects is an NSMutableDictionary
- (id) objectForId:(NSUInteger)id {
  return [objects objectForKey:[NSNumber numberWithInt:id]];
}
- (void) addObject:(Object *)foo {
  [objects setObject:foo forKey:[NSNumber numberWithInt:id]];
}

in diese:

//objects is an NSSet
- (id) objectForId:(NSUInteger)id {
  return [objects objectForHash:id];
}
- (void) addObject:(Object *)foo {
  [objects addObject:foo];
}

11voto

bbum Punkte 161596

Sie sollten die C-API für NSMapTable verwenden, nachdem Sie eine NSMapTable-Instanz für die Verwendung von Integer-Schlüsseln konfiguriert haben. Ein Beispiel:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSMapTable *mt = [NSMapTable mapTableWithKeyOptions: NSPointerFunctionsIntegerPersonality | NSPointerFunctionsOpaqueMemory
                                           valueOptions: NSPointerFunctionsObjectPersonality];

    for(NSUInteger i = 0; i<10; i++) 
        NSMapInsert(mt, (void *) i, [NSNumber numberWithInt: i]);

    for(NSUInteger j = 0; j<10; j++)
        NSLog(@"retrieved %@", (id) NSMapGet(mt, (void *) j));

    [pool drain];
    return 0;
}

Beachten Sie, dass es einen Fehler in NSMapTable() zu geben scheint, der es nicht erlaubt, dass 0 ein Schlüssel ist. Ups.

Eine bessere Dokumentation der funktionalen API zu NSMapTable wird in rdar://problem/7228605 gefordert.

Eine Lösung für das 0-Schlüssel-Problem ist in rdar://problem/7228618 dokumentiert.

3voto

Ed Marty Punkte 39312

Am Ende habe ich eine Kategorie auf NSDictionary erstellt, um Objekte auf der Grundlage von int-Schlüsseln zu speichern:

@implementation NSMutableDictionary (IntKeyDictionary)
- (void) setObject:(id)obj forId:(int)id {
  [self setObject:obj forKey:[NSNumber numberWithInt:id]];
}

- (void) removeObjectForId:(int)id {
  [self removeObjectForKey:[NSNumber numberWithInt:id]];
}

- (id) objectForId:(int)id {
  return [self objectForKey:[NSNumber numberWithInt:id]];
}
@end

0voto

fbrereto Punkte 34770

NSDictionary 's setObject:forKey: nimmt bereits den Schlüssel von id und genau das scheinen Sie mit Ihrer NSSet gleichwertig. Was an NSDictionary ist für Ihre Zwecke unzureichend?

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