我正在尝试创建一个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];
}
答案 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对你的目的来说是不够的呢?