是否有类似NSSet允许通过哈希值检索?

时间:2009-09-16 16:33:52

标签: objective-c

我正在尝试创建一个NSDictionary,它使用基于ID的键存储对象。我知道我可以使用NSNumber对象,但为什么我不能只使用int呢?是否有一些课程支持这个?像NSSet这样的东西几乎可以工作,除了我无法通过它的哈希值访问它(我已经覆盖- (NSUInteger) hash以返回对象的ID,它始终是唯一的)

我基本上试图解决这个问题:

//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 个答案:

答案 0 :(得分:11)

在配置NSMapTable实例以使用整数键后,您将要使用C API到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成为键。糟糕。

在&lt; rdar:// problem / 7228605&gt;中请求更好地记录NSMapTable的功能API。

&lt; rdar:// problem / 7228618&gt;

中记录了对0键问题的修复

答案 1 :(得分:3)

我最终在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

答案 2 :(得分:0)

NSDictionary的{​​{3}}已经通过id获取了密钥,这就是您使用NSSet等效内容的情况。那么NSDictionary对你的目的来说是不够的呢?