Есть ли что-то вроде NSSet, который позволяет получать по хеш-значениям? - PullRequest
2 голосов
/ 16 сентября 2009

Я пытаюсь создать NSDictionary, который хранит объекты с ключами на основе идентификаторов. Я знаю, что могу использовать объекты NSNumber, но почему я не могу просто использовать вместо него int? Есть какой-то класс, который поддерживает это? Что-то вроде NSSet почти работает, за исключением того, что я не могу получить к нему доступ по его хэш-значению (я переопределил - (NSUInteger) hash, чтобы вернуть идентификатор объекта, который всегда уникален)

Я в основном пытаюсь повернуть это:

//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]];
}

в это:

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

Ответы [ 3 ]

11 голосов
/ 16 сентября 2009

Вы захотите использовать C API для NSMapTable после настройки экземпляра NSMapTable для использования целочисленных ключей. Пример:

#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;
}

Обратите внимание, что в NSMapTable (), похоже, есть ошибка, из-за которой 0 не может быть ключом. К сожалению.

Лучшая документация функционального API для NSMapTable запрашивается в .

Исправление проблемы с ключом 0 описано в

3 голосов
/ 27 октября 2009

Я закончил тем, что создал категорию в NSDictionary для хранения объектов на основе ключей int:

@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
0 голосов
/ 16 сентября 2009

NSDictionary setObject:forKey: уже берет ключ на id, что, похоже, вы делаете с эквивалентом NSSet А что с NSDictionary недостаточно для ваших целей?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...