NSMutableDictionary
変更可能な辞書クラス
解説
変更可能な「辞書」と呼ばれるコレクションクラスの一つです。
継承 | NSDictionary : NSObject |
準拠 | NSCopying (NSDictionary) |
NSMutableCopying (NSDictionary) | |
NSFastEnumeration (NSDictionary) | |
NSSecureCoding (NSDictionary) | |
NSObject (NSObject) |
フレームワーク | /System/Library/Frameworks/Foundation.framework |
使用可能 | Mac OS X v10.0 以降 |
定義 | NSDictionary.h |
NSKeyValueCoding.h |
概要
キーと値で構成されたペア(エントリーと呼ばれます)を持つ、辞書を呼ばれ、エントリーの変更が可能なクラスです。
変更する必要がない場合はNSDictionaryクラスを使います。
NSMutableDictionaryはNSDictionaryを継承していますのでNSDictionaryのメソッドはそのまま使うことができます。
辞書作成時にキーは辞書内にコピーされ、値は参照のみが保持されます。(NSDictionaryの一部のメソッドを除く)キーは一般にNSStringオブジェクトが使用されますが、NSStringに限定される事無く、-isEqualメッセージに応答するオブジェクトなら問題ないようです。
NSMutableDictionaryに数値や構造体を入れるにはNSNumberクラスやNSValueクラスを使います。nilは辞書の終わりの印として使用されていますので代わりにNSNullオブジェクトを使用して「何も無い」状態を表します。(多くの場合、[NSNull null] として使用します。)
NSValueを使って、NSRangeをNSDictionaryに含める方法
#pragma mark NSMutableDictionary NSValue -(void)method003 { NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10]; [aDictionary setValue:@"ddd" forKey:@"key4"]; NSRange aRange = NSMakeRange(0, 10); [aDictionary setObject:[NSValue valueWithRange:aRange] forKey:@"eee"]; [aDictionary setObject:[NSValue value:&aRange withObjCType:@encode(NSRange)] forKey:@"fff"]; NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allValues"]); //=>-[OOOAppDelegate method003] 0x6a2ac10 (ddd,"NSRange: {0, 10}","NSRange: {0, 10}") }
C言語のフレームワークである、Core FoundationのCFMutableDictionaryRefとトールフリーブリッジです。ARC環境以外ではそのまま使用できます。
どちらかのフレームワークにしかないメソッド・関数を使いたい場合、キャストして使うことが出来ます。
ARC環境では、管理対象のオブジェクトのキャストに__bridge、__bridge_retained、__bridge_transferが必要になります。
作成と初期化
仮のエントリー数を指定して変更可能な辞書を作成するメソッド(+ dictionaryWithCapacity)があります。NSDictionaryの空の辞書を作るメソッド(+dictionary)を使ってNSMutableDictionaryを作成し、初期化するメソッド(– initWithCapacity)もあります。
仮のエントリー数は効率化のために最初に参考にされるのみで、エントリー数が制限されるわけではありません、必要に応じて拡張されます。
一般的なNSMutableDictionaryの作成
#pragma mark NSMutableDictionary dictionaryWithCapacity -(void)method002 { NSMutableDictionary *aDictionary = [NSMutableDictionary dictionaryWithCapacity:10]; [aDictionary setValue:@"ddd" forKey:@"key4"]; [aDictionary setObject:[NSNumber numberWithInt:1] forKey:@"eee"]; NSLog(@"%s %p %@",__FUNCTION__,aDictionary,[aDictionary valueForKey:@"@allKeys"]); //=>-[OOOAppDelegate method002] 0x6c15440 (key4,eee) }
エントリーの追加
変更可能な辞書に、キーと値で構成されたエントリーを追加するメソッド(– setObject:forKey)があります。すでに同じキーがあった場合は新しいものに置き換わります。キーやオブジェクトがnilなら例外が発生します。
キーバリューコーディングで使うメソッド(– setValue:forKey)もあります。この場合、キーは文字列でなければいけません。
– setObject:forKeyのキーはオブジェクトであってisEqual:で比較できれば、たとえばNSNumberやNSImageでも良いのですが、– setValue:forKeyの方は、キーが文字列でなければいけない、という違いがあります。
変更可能な辞書を渡してエントリーを追加するメソッド(– addEntriesFromDictionary)は、追加する辞書のエントリーと同じキーがある場合は、新しい値に置き換わります。
すべての内容を入れ替える場合には(– setDictionary)メソッドを使います。
エントリーの除去
変更可能な辞書からすべてのエントリーを除去するには(– removeAllObjects)メソッドを使います。一つのエントリーを除去するには(– removeObjectForKey)メソッドを、複数のエントリーを除去するには(– removeObjectsForKeys)メソッドを使います。
変更可能な辞書の作成と初期化
変更可能な辞書にエントリーを追加
– setObject:forKey
– setValue:forKey
– addEntriesFromDictionary
– setDictionary
変更可能な辞書からエントリーを取り除く
– removeObjectForKey
– removeAllObjects
– removeObjectsForKeys