辞書と集合のクラス (1/7)
作成:2011-02-17 11:26
更新:2011-11-13 21:11
更新:2011-11-13 21:11
■連想配列(辞書)とNSDictionary
配列やNSDictionaryといったものは、データを「インデックス」という番号で管理しています。ですから、保管しているものをすべて番号で順番に取り出したりすることも簡単にできます。が、逆に言えば、「番号でしか管理できない」ということにもなります。
あるデータに関連付けた別データを用意したい、というようなときがあったとしましょう。例えば、名前を保管している配列があって、それぞれの人の電話番号を別に管理したい、というようなケースを考えてみてください。
これを配列にして、名前の配列と同じインデックス番号にデータを保管する……というやり方ももちろん可能です。が、それよりも「インデックスではなく、名前を使って電話番号を取り出せる」というようになっていたら、はるかに便利だと想いませんか?
こうした「1つ1つの値に名前をつけて値を管理する」というやり方でデータを管理する配列を、一般に「連想配列」と呼びます。Objective-Cでは、これは「辞書」と呼ばれます。辞書クラスには、内容を変更できない「NSDictionary」と、内容を変更できる「NSMutableDictionary」というものが用意されています。
これらの辞書クラスは、「キー」と「値」からデータが構成されています。すべての値には、「キー」と呼ばれるラベル(名前)がつけられており、このキーを使って値は管理されます。値を取り出したりするときは、そのキーを指定して呼び出すのです。
配列と異なり、インデックスは用意されていません。したがって、番号で値を取り出すことはできません。ということは、データの並び順も保証されてはいない、ということになります。またキーは同じものは複数用意できません。すべてのキーは「ユニーク」である必要があります。(ユニーク=すべての値が別々で、重複する値が存在しないこと)
まずは、基本である「NSDictionary」から説明しましょう。これは辞書クラスの基本となるものです。いくつかのコンビニエンスコンストラクタが用意されていますので、中でも主に用いられるものをいくつか紹介しておきましょう。
では、下に簡単な利用例をあげておきましょう。3つの要素からなるNSDictionaryを作成し、NSLogで出力しています。出力内容を見ると、それぞれの名前のキーに電話番号が保管されていることがよくわかるでしょう。
あるデータに関連付けた別データを用意したい、というようなときがあったとしましょう。例えば、名前を保管している配列があって、それぞれの人の電話番号を別に管理したい、というようなケースを考えてみてください。
これを配列にして、名前の配列と同じインデックス番号にデータを保管する……というやり方ももちろん可能です。が、それよりも「インデックスではなく、名前を使って電話番号を取り出せる」というようになっていたら、はるかに便利だと想いませんか?
こうした「1つ1つの値に名前をつけて値を管理する」というやり方でデータを管理する配列を、一般に「連想配列」と呼びます。Objective-Cでは、これは「辞書」と呼ばれます。辞書クラスには、内容を変更できない「NSDictionary」と、内容を変更できる「NSMutableDictionary」というものが用意されています。
これらの辞書クラスは、「キー」と「値」からデータが構成されています。すべての値には、「キー」と呼ばれるラベル(名前)がつけられており、このキーを使って値は管理されます。値を取り出したりするときは、そのキーを指定して呼び出すのです。
配列と異なり、インデックスは用意されていません。したがって、番号で値を取り出すことはできません。ということは、データの並び順も保証されてはいない、ということになります。またキーは同じものは複数用意できません。すべてのキーは「ユニーク」である必要があります。(ユニーク=すべての値が別々で、重複する値が存在しないこと)
まずは、基本である「NSDictionary」から説明しましょう。これは辞書クラスの基本となるものです。いくつかのコンビニエンスコンストラクタが用意されていますので、中でも主に用いられるものをいくつか紹介しておきましょう。
NSDictionary *変数 = [NSDictionary dictionaryWithObject:《id》1つの要素だけのNSDictionaryを作成するなら、これが一番でしょう。引数に、保管する値と、それにつけるキーをそれぞれ指定します。どちらもオブジェクトであれば何でもいいのですが、まぁキーについては「NSStringによるテキストを指定するのが基本」と考えましょう。
forKey:《id》];
NSDictionary *変数 = [NSDictionary dictionaryWithObjects:《id》複数の要素をもったNSDictionaryを作成する場合は、値とキーをそれぞれNSArrayにまとめたものを引数に指定してインスタンスを生成します。もちろん、それぞれの値と、それに設定するキーは、きれいに順番を揃えておかないといけません。
forKeys:《id》];
NSDictionary *変数 = [NSDictionary dictionaryWithObjectsAndKeys:これは、キーと値をすべてまとめて書くやり方。値とキーを交互に「@"値1",@"キー1",@"値2",@"キー2",……」という具合に用意しておくのです。これで、最初から順番に値とキーをセットで取り出してNSDictionaryに保管したものが作られます。なお、この場合も最後にnilを忘れないようにしてください。
《id》,《id》,……];
では、下に簡単な利用例をあげておきましょう。3つの要素からなるNSDictionaryを作成し、NSLogで出力しています。出力内容を見ると、それぞれの名前のキーに電話番号が保管されていることがよくわかるでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { NSArray* keys = [NSArray arrayWithObjects: @"tuyano",@"taro",@"hanako",nil]; NSArray* vals = [NSArray arrayWithObjects: @"090-9999-9999",@"03-555-5555", @"080-765-4321",nil]; NSDictionary* dic = [NSDictionary dictionaryWithObjects:vals forKeys:keys]; NSLog(@"%@",dic); } return 0; }
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る