libro
www.tuyano.com
初心者のためのObjective-Cプログラミング入門

辞書と集合のクラス (3/7)

作成:2011-02-17 11:31
更新:2011-11-13 21:09

■NSMutableDictionaryを使う

NSDictionaryは保管するデータの変更ができません。これを拡張し、データの編集を行えるようにしたのが「NSMutableDictionary」です。NSDictionaryを継承して作られており、データの変更や削除などに関する機能が追加になっています。

NSMutableDictionaryのインスタンス作成には、いくつかのコンビニエンスコンストラクタが用意されています。もっとも簡単なのは、以下のようなものでしょう。
NSMutableDictionary *変数 =  [NSMutableDictionary dictionary];
このdictionaryメソッドは、スーパークラスのNSDictionaryに用意されているものです。とりあえずこれでインスタンスだけ作り、後はそこに値を保管していく、というやり方ができます。この他、最初にある程度の保管するエリアを確保しておくやり方があります。
NSMutableDictionary *変数 = [NSMutableDictionary dictionaryWithCapacity:
        《NSUInteger》];
dictionaryWithCapacity:の引数には、最初に確保しておく要素数を指定します。といっても、NSMutableDictionaryは可変ですから、足りなくなれば自動的に拡張され問題なくデータを保管できますので心配は無用です。あくまで「初期値」として指定しておくものです。

では、ここにデータを追加するにはどうするのでしょうか。NSStringNSMutableArrayなどでは「add〜」といったメソッドが用意されていましたが、NSMutableDictionaryには「値の追加」のためのメソッドはありません(本当はあるけど)。あるのは「値の設定」のためのメソッドだけです。
[《NSMutableDirectory*》 setObject:《id*》 forKey:《id》];
これは、forKey:で指定したキーに、setObject:のオブジェクトを設定するものです。もし、まだそのキーが使われていなければ新たに作成して追加しますし、既に使われていたらその値を変更します。つまり、NSMutableDictionaryには「追加」という感覚がないのです。ただ「このキーにこれを保管」とすればいいだけなのですね。

ただし、このやり方だと、1つ1つのキーに順番にデータを設定していかないといけません。正直、これはかったるいぞ、ということもあるでしょう。そうした場合、あらかじめNSDictionaryとして用意したデータをまとめて追加するというメソッドは用意されています。
[
《NSMutableDirectory*》 addEntriesFromDictionary:《NSDictionary*》];
これで、引数のNSDictionaryに保管されているデータがまとめて追加されます。いくつかの辞書を1つに統合するときなどには便利なメソッドでしょう。

また、既にあるデータを削除するためのメソッドも色々と用意されています。とりあえず、以下の2つだけ覚えておけば困ることはないでしょう。
[《NSMutableDirectory*》 removeAllObjects];
[《NSMutableDirectory*》 removeObjectForKey:《id》];
前者は、すべてのデータを削除するためのものです。後者は、引数に指定したキーのデータを削除します。removeObjectForKey:は、削除するキーが見つからなかった場合は、特に何もしません。したがってエラーにもなりません。

非常に簡単にデータの操作を行えるNSMutableDictionaryですが、なんでもできるというわけではありません。頭に入れておきたいのは「キーの変更はできない」ということです。もし、ある値を設定しているキーを変更したければ、新たなキーで値を保存しなおしてから古いキーを削除する、という形になるでしょう。

これらの簡単な利用例を以下にあげておきます。setObject: forKey:でデータを設定し、removeObjectForKey:で削除をしています。こんな具合に、簡単に辞書のデータを操作することができます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableDictionary* dic = [NSMutableDictionary
               dictionary];
        [dic setObject:@"090-9999-9999" forKey:@"tuyano"];
        [dic setObject:@"03-555-5555"forKey:@"taro"];
        [dic setObject:@"080-765-4321"forKey:@"hanako"];
        
        [dic removeObjectForKey:@"taro"];
        NSLog(@"%@",dic);
    }	
	return 0;
}
※関連コンテンツ

「初心者のためのObjective-Cプログラミング入門」に戻る