Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

NSMutableDictionary

INDEX>Foundation>

変更可能な辞書クラス

apple(OS X)
apple(iOS)

解説

変更可能な「辞書」と呼ばれるコレクションクラスの一つです。

継承 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)メソッドを使います。


変更可能な辞書の作成と初期化

+ dictionaryWithCapacity
– initWithCapacity

変更可能な辞書からエントリーを取り除く

– removeObjectForKey
– removeAllObjects
– removeObjectsForKeys