NSDictionaryがペア値に適している場合、トリプル値に適しているのは何ですか?
-
06-07-2019 - |
質問
NSDictionaryはキーと値のペアに適していますが、3つの値がある場合にどのデータ構造が最適ですか?これら3つの値のクラスを作成し、配列内の各オブジェクトにそのクラスのインスタンスを含めるのが最善ですか?
具体的には、データ構造をPersonと呼びましょう。3つの値があります。 (NSString)name、(int)age、(BOOL)isAlive
これらはarray(?)に保持されます。名前をキーとして使用し、ブロック全体をゼロから始まる数字で参照できるようにすることが重要です。
解決
1つのキーと2つの値がある場合、おそらく2つの値のクラスを作成し、辞書を使用します。
2つのキーと1つの値がある場合、ネストされた辞書、つまり、キーが最初のキーで値が別の辞書である辞書を使用するでしょう。ネストされた辞書のキーは2番目のキーになり、値は実際の値になります。
ETA:
これで質問が明確になりました-キーまたは整数インデックスの両方でコレクションにアクセスする必要がある場合でも、辞書を使用できます。
キーでアイテムを取得するには、次のようにします:
[myDict objectForKey:@"joe"];
インデックスでアイテムを取得するには、allKeys配列を使用できます:
[myDict objectForKey:[[myDict allKeys] objectAtIndex:1]];
インデックスで人々を取得する唯一の目的がコレクション全体をループする場合、keyEnumeratorメソッドを使用してループ内のキーを列挙し、それらのキーを使用して値を検索することをお勧めします。
他のヒント
リレーショナルデータベースモデルを使用して、コアデータを使用してより複雑なデータ関係を表すことができます。
例とドキュメントについては、アップルの開発者サイトをご覧ください。
最初は無関係に見えるかもしれませんが、このの辞書指向の構造を確認してください。ココアバインディング。 (CocoaDevCentralとScott Stevensonは、新しいCocoa開発者にとって素晴らしいリソースです。)彼が使用するアプローチは、非常に柔軟で、将来変更が容易です。 ivarsの代わりに辞書を使用することは常に最良の解決策ではありませんが、ニーズに合うかもしれません。
注:コアデータと同様に、Cocoaバインディングも非常に複雑なトピックです。私は、チュートリアルの組織的な側面のみを使用することをお勧めします。バインディングに全面的に取り組むことはお勧めしません。 :-)
一般的なデータ構造を作成しようとしているかどうかによって異なります。 「3つの」ものがアプリ内の特定の概念である場合、ドメインモデル-この場合、これらの値をクラスにカプセル化するのが賢明かもしれません。
ディクショナリのような機能が必要な場合-[NSDictionary objectForKey:]など-キー値をクラスインスタンスにマッピングするインデックスとして1つ以上のディクショナリを引き続き使用できます。
CoreDataを調べ(保存している場合)、オブジェクトのクラスを定義する必要があります。 NSDictionaryなどのネイティブジェネリックオブジェクトは、Personのような複雑なオブジェクトを構成する複雑な値を格納するためのものではありません。
Person *person = [[Person alloc] init];
person.firstName = @"blah";
person.age = 24;
person.isAlive = YES;
2次元配列の説明ではありませんか?