2

我有一种情况,我想将一对对象映射到信息字典。我想避免创建 NSDictionary 的 NSDictionaries 的 NSDictionary,因为这简直令人困惑且难以维护。

例如,如果我有两个类,Foo 和 Bar,我想要 {Foo, Bar} -> {NSDictionary}

除了基于所讨论的两种类型制作自定义类(仅用作字典键)之外,还有其他选择吗?也许类似于我不知道的 STL 的配对类型?

4

3 回答 3

5

就像你说的,你可以创建一个 Pair 类:

//Pair.h
@interface Pair : NSOpject <NSCopying> {
  id<NSCopying> left;
  id<NSCopying> right;
}
@property (nonatomic, readonly) id<NSCopying> left;
@property (nonatomic, readonly) id<NSCopying> right;
+ (id) pairWithLeft:(id<NSCopying>)l right:(id<NSCopying>)r;
- (id) initWithLeft:(id<NSCopying>)l right:(id<NSCopying>)r;
@end

//Pair.m
#import "Pair.h"
@implementation Pair
@synthesize left, right;

+ (id) pairWithLeft:(id<NSCopying>)l right:(id<NSCopying>)r {
 return [[[[self class] alloc] initWithLeft:l right:r] autorelease];
}

- (id) initWithLeft:(id<NSCopying>)l right:(id<NSCopying>)r {
  if (self = [super init]) {
    left = [l copy];
    right = [r copy];
  }
  return self;
}

- (void) finalize {
  [left release], left = nil;
  [right release], right = nil;
  [super finalize];
}

- (void) dealloc {
  [left release], left = nil;
  [right release], right = nil;
  [super dealloc];
}

- (id) copyWithZone:(NSZone *)zone {
  Pair * copy = [[[self class] alloc] initWithLeft:[self left] right:[self right]];
  return copy;
}

- (BOOL) isEqual:(id)other {
  if ([other isKindOfClass:[Pair class]] == NO) { return NO; }
  return ([[self left] isEqual:[other left]] && [[self right] isEqual:[other right]]);
}

- (NSUInteger) hash {
  //perhaps not "hashish" enough, but probably good enough
  return [[self left] hash] + [[self right] hash];
}

@end

编辑:

关于创建可以作为键的对象的一些注意事项:

  1. 它们必须符合NSCopying协议,因为我们不希望密钥从我们下面改变。
  2. 由于 Pair 本身被复制,因此我确保 Pair 中的对象也被复制。
  3. 密钥必须执行isEqual:。我实施了hash很好的方法,但可能没有必要。
于 2009-10-20T04:35:15.460 回答
3

您可以尝试NSMapTable,然后您的键几乎可以是任何东西,如果您愿意,可能是指向结构的指针。

(以下评论的附录:NSMapTable 曾经不在 iOS 上,但在 iOS 6 上可用。)

于 2009-10-20T03:52:55.793 回答
0

正在使用某些东西

[NSString stringWithFormat:@"%@ %@", [obj1 key_as_string], [oj2 key_as_string]]

对你没有好处,key_as_string 是你的对象类的一部分吗?即从字符串中生成密钥。

于 2010-03-02T07:19:21.163 回答