1

オブジェクトが辞書に載っているかどうかを見つける方が簡単だと思っていましたが、そうではないようです。

「products」という名前のキーが 1 つだけの NSMutableDictionary があります。

次のようなものを使用して、辞書に動的に追加されたいくつかの製品があります

[myDict addObject:@"banana" forKey:@"products"];
[myDict addObject:@"orange" forKey:@"products"];
[myDict addObject:@"grapes" forKey:@"products"];

ある時点で、たとえばバナナが辞書に載っているかどうかを知りたいと思います。

それを行う方法はありますか?オブジェクトが辞書に載っているかどうかを知りたいだけですか?

助けてくれてありがとう。

4

3 に答える 3

7

辞書の仕組みを誤解しています。ディクショナリは、 1 つのキーに対して1 つの値を格納します。したがって、コードの実行後、は単一のキーと値のペアを保持します: => . 複数のオブジェクトを指すキーが必要な場合、キーは(または順序を気にしない場合)を指す必要があり、辞書からではなく、オブジェクトを追加および削除します。myDict@"products"@"grapes"NSMutableArrayNSMutableSetNSMutableArray

これがディクショナリ内のすべての基本構造になる場合は、次のようにディクショナリのラッパーを作成することを検討してください。

//DDMutableMultiValueDictionary.h
@interface DDMutableMultiValueDictionary : NSObject {
  NSMutableDictionary * dict;
}

- (void) addObject:(id)value forKey:(id)key;
- (void) removeObject:(id)value forKey:(id)key;
- (BOOL) containsObject:(id)value forKey:(id)key;

@end

//DDMutableMultiValueDictionary.m
#import "DDMutableMultiValueDictionary.h"

@implementation DDMutableMultiValueDictionary

- (id) init {
  if (self = [super init]) {
    dict = [[NSMutableDictionary alloc] init];
  }
  return self;
}

- (void) dealloc {
  [dict release];
  [super dealloc];
}

- (void) addObject:(id)value forKey:(id)key {
  NSMutableArray * values = [dict objectForKey:key];
  if (values == nil) {
    values = [NSMutableArray array];
    [dict setObject:values forKey:key]
  }
  [values addObject:value];
}

- (void) removeObject:(id)value forKey:(id)key {
  NSMutableArray * values = [dict objectForKey:key];
  [values removeObject:value];
}

- (BOOL) containsObject:(id)value forKey:(id)key {
  NSMutableArray * values = [dict objectForKey:key];
  return [values containsObject:value];
}

@end

これは決して完全ではありませんが、どのように作成できるかについてのアイデアを提供します。

于 2009-10-18T16:49:46.207 に答える
2

好きなものをオブジェクトとして配置できます。objectForKey を使用するとnil、オブジェクトがディクショナリにない場合は返され、ある場合はオブジェクトが返されます。次のように使用できます。

[myDict addObject:@"WHATEVER YOU WANT" forKey:@"banana"];
[myDict addObject:@"WHATEVER YOU WANT" forKey:@"orange"];
[myDict addObject:@"WHATEVER YOU WANT" forKey:@"grapes"];
..
..
..
if ([myDict objectForKey:@"banana"]) {
  // I have a banana
} 
if ([myDict objectForKey:@"orange"]) {
  // I have an orange
} 
if ([myDict objectForKey:@"grapes"]) {
  // I have grapes
} 
于 2009-10-18T16:54:58.943 に答える
2

辞書の仕組みを誤解している可能性があるという他のポスターに同意します。しかし、それが役立つ場合があります。特定のオブジェクトが値として存在するかどうか、およびどのキーに対して存在するかを確認する方法は次のとおりです。

// assume the object you're looking for is in the variable myValue
NSArray *keys = [myDict allKeysForObject:myValue];
if( [keys count] ) {
  // do whatever ...
}
于 2009-10-18T17:06:12.223 に答える