タイトル今から始めるCocoaプログラミング》文書ファイルを扱うアプリケーションを作る(補足)NSDictionaryクラスカテゴリーユーザインタフェース, Cocoa, 今から始めるCocoaプログラミング
作成日2002/1/8 15:54:30作成者新居雅行
NSDictionaryクラスは、immutableつまりいったん作成すると内容が変更されないことが保証されたクラスで、特定のキーに対応するデータを管理することができるクラスだ。java.util.Properties(ないしはHashTable、Dictionary)や、あるいはPerlでの連想配列と同じようなものであるが、それのCocoa版である。データを複数記憶できる、個数は可変である。それらのデータを取り出すのに、キーというデータを指定する。あるデータにキーが割りあっててあってキーを手がかりに取り出すということができる。また、キーやデータをまとめて取り出すという機能がある。コンストラクタは次のように定義されている。4つあるが、immutableなので、引数無しで空のNSDictionaryを作ることは実用上はまずないだろう。4つ目は事実上のNSDictionaryクラスのコピー処理を行うことになる。データを記録させるには、2つ目ないしは3つ目を使うことになる。なお、キーとデータのペアを後から追加することはできないので、コンストラクタで生成時に、データを詰め込んでしまわないといけない。

☆NSDictionaryクラスのインスタンスを生成する(コンストラクタ)
 new NSDictionary();
 new NSDictionary( Object[] objects, Object[] keys);
 new NSDictionary( Object anObject, Object aKey);
 new NSDictionary(NSDictionary otherDictionary);
 戻り値:生成したNSDictionaryクラスのインスタンスへの参照
 引数:objects:データ
    key:データに対応するキー
    otherDictionary:これと同じ内容のNSDictionaryを生成する。

キーとデータはいずれにしても配列で指定する。Object型だから、つまりはJavaのクラスであれば何でもいいということになる。一方、基本型の配列はそのままでは設定できないということになるだろう。たとえば、yearというキーに「2002」、monthというキーに「1」、dayというキーに「8」というデータを割り当てるとすると、例えば次のようなプログラムとなる。整数データは、java.lang.Integerクラスを使えばいいだろう。データとキーをそれぞれ配列にするので、対応がきちんとなるように順序に気をつけて配列を作ればよく。

String keys[] = {"year", "month", "day"};
Integer data[] = {new Integer(2002), new Integer(1), new Integer(8)};
NSDictionary dict = new NSDictionary(data, keys);

NSDictionaryにあるメソッドのうち、よく利用するものを以下にまとめておく。他にもあるが、一般にはここで紹介したものを使うのが一般的だろう。

☆キーとデータのペアの個数を求める
 int 〈NSDictionary〉.count();
 戻り値:データの個数

☆キーに対するデータを求める
 Object 〈NSDictionary〉.objectForKey(Object akey);
 戻り値:データ(存在しないキーの場合はnullとなる)
 引数:key:キー

☆すべてのキーをEnumerationクラスで得る
 java.util.Enumeration 〈NSDictionary〉.keyEnumerator();
 戻り値:キーのリスト

たとえば、以下のようなプログラムで、変数pathで指定したファイルのファイル情報を、標準出力にキーとデータのペアとして書き出す。

import java.util.*;
   :
String path = "/Users/msyk/text.txt";
NSDictionary dic = NSPathUtilities.fileAttributes( path, false);
Enumeration enum = dic.keyEnumerator();

while (enum.hasMoreElements()) {
Object key = enum.nextElement();
Object obj = dic.objectForKey(key);
System.out.println("key="+key.toString()+", data="+obj.toString());
}

(この項、続く)
関連リンク