2

オブジェクトのペアを情報の辞書にマップしたいという状況があります。NSDictionaries of NSDictionaries of NSDictionariesを作成することは、単に混乱を招き、保守が難しいため、避けたいと思います。

たとえば、FooとBarの2つのクラスがある場合、{Foo、Bar}->{NSDictionary}が必要です。

問題の2つのタイプに基づいて(辞書キーとして使用するためだけに)カスタムクラスを作成する以外のオプションはありますか?たぶん私が知らないSTLのペアタイプに似た何か?

4

3 に答える 3

5

あなたが言ったように、ペアクラスを作成できます:

//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. ペア自体がコピーされるため、ペア内のオブジェクトもコピーされるようにします。
  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 に答える