NSDictionaryクラス

2010. 10. 24
●概要

NSDictionaryクラスは、キーと値の不変な関連付けを管理するオブジェクトのプログラムインターフェイスを宣言します。

このクラスまたはサブクラスのNSMutableDictionaryは、任意のキーに関連付けられたデータを簡易に且つ効率的に取得する場合に使用します。
(便宜上、厳密な特定のクラスメンバを除いて、これらのクラスのインスタンスを辞書(dictionary)と呼びます)

辞書のキーと値のペアをエントリと呼びます。

各エントリの構成は、キーとキーの値となるオブジェクトで一つのオブジェクトとして表されます。

辞書内でキーは固有のものになります。

一つの辞書の中で、(isEqual:で確認できる)同じキーが2つ存在してはいけません。

キーは(NSCopyingプロトコルに準拠している)任意のオブジェクトを指定できますが、一般的にはキー値コーディングで使用できるよう、キーには文字列を使用します。
(『Key-Value Coding Programming Guide』参照)

キーも値もnilにすることはできません。

辞書内でnull値を表す場合は、NSNullを使用してください。

NSDictionaryのインスタンスは不変辞書なので、エントリを確立して生成した後で変更することはできません。

NSMutableDictionaryのインスタンスは可変辞書で、いつでもエントリの追加や削除ができ、オブジェクトは自動的にメモリを必要に応じて割り当てます。

辞書クラスはNSCopyingとNSMutableCopyingプロトコルを採用しており、他の辞書の型を容易に変換することができます。

NSDictionaryとNSMutableDictionaryはクラスクラスタの一部で、このインターフェイスで生成したオブジェクトは、これら2つのクラスの実際のインスタンスではありません。

正確には、インスタンスはこれらのプライベートサブクラスの一つに属しています。

辞書のクラスはプライベートですがインターフェイスはパブリックで、NSDictionaryとNSMutableDictionaryの抽象的なスーパークラスで宣言されています。

辞書は内部的に、キーに一致する値に迅速にアクセスするため、ストレージの構成にハッシュテーブルを使用しています。

しかしハッシュテーブルやハッシュ関数、キーのハッシュ値などの作業は複雑なため。このクラスタのメソッドの定義からは隔離されています。

メソッドがハッシュ形式ではなく、キーを直接取得する方法を以下で説明します。

(全ての辞書における初期化の一部、または可変辞書における変更として)メソッドが辞書にエントリを追加する際、引数の各キーをコピーし、辞書にコピーを追加します。
(キーはNSCopyingプロトコルに準拠している必要があります)

対応する各値オブジェクトは、辞書に渡す前に解放されないようにretainメッセージを受け取ります。


列挙

辞書のコンテンツとして、keyEnumeratorとobjectEnumeratorで返されるNSEnumeratorオブジェクトを使って、キーや値を列挙することができます。

Mac OS X v10.5以降では、NSDictionaryはNSFastEnumerationプロトコルをサポートします。

辞書のキーをfor...inを使って列挙で構築する例を以下に示します。

NSArray *keys = [NSArray arrayWithObjects:@"key1", @"key2", @"key3", nil];
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", @"value3", nil];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

for (id key in dictionary) {
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]);
}

Mac OS X v10.6以降ではNSDictionaryはブロックオブジェクトを使用した列挙をサポートしています。


基本的なメソッド

NSDictionaryの基本的な三つのメソッド(count、objectForKey:、keyEnumerator)は、他のメソッドのインターフェイスの全ての基礎を提供します。

countメソッドは辞書内のエントリ数を返します。

objectForKey:は指定したキーに関連する値を返します。

keyEnumeratorは辞書内の各キーを反復処理するオブジェクトを返します。

他のメソッドは、一つ以上の三つの基礎的なメソッドを呼び出すことによって処理の宣言をします。

基礎的なメソッド以外は、複数のエントリに一度にアクセスする便利な方法を提供します。


説明と永続性

description...とwriteToFile:atomicallyメソッドは、辞書のプロパティリストの説明に、それぞれ文字列とファイルを書き込むことができます。

これらは一般的に、カステムデータオブジェクトの永続的なストレージに使用されるものではありません。
(『Archives and Serializations Programming Guide』を参照してください)


Toll-Free Bridging

NSDictionaryには『toll-free bridged』の対象としてCore FoundationのCFDictionary Referenceがあります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

したがってNSDictionary *パラメータを参照する際、CFDictionaryRefに渡し、CFDictionaryRefパラメータとして参照でき、(コンパイラの警告を抑えるために型変換をして)NSDictionaryインスタンスに渡すこともできます。

この橋渡しは、NSDictionaryの実際のサブクラスに適用されます。

型変換に関する詳細は『toll-free bridging』を参照してください。


サブクラス化

通常、NSDictionaryをサブクラス化する必要はあまりありません。

カスタマイズした動作が必要な場合、サブクラス化するより良い構成を検討してください。

NSDictionaryをサブクラス化する必要がある場合、Class clusterで表されていることを考慮に入れる必要があります。

したがって、基礎的な概念としていくつかの基本的なメソッド

count
objectForKey:
keyEnumerator

を、サブクラスでは全てオーバーライドする必要があります。

NSDictionaryの他のメソッドは、一つ以上のこれら基本的なメソッドを呼び出して処理します。

基礎的なメソッド以外は、複数のエントリに一度にアクセスする便利な方法を提供します。



●タスク

●辞書の生成

+ dictionary
+ dictionaryWithContentsOfFile:
+ dictionaryWithContentsOfURL:
+ dictionaryWithDictionary:
+ dictionaryWithObject:forKey:
+ dictionaryWithObjects:forKeys:
+ dictionaryWithObjects:forKeys:count:
+ dictionaryWithObjectsAndKeys:

●NSDictionaryインスタンスの初期化

– initWithContentsOfFile:
– initWithContentsOfURL:
– initWithDictionary:
– initWithDictionary:copyItems:
– initWithObjects:forKeys:
– initWithObjects:forKeys:count:
– initWithObjectsAndKeys:

●エントリのカウント

– count

●辞書の比較

– isEqualToDictionary:

●キーと値へのアクセス

– allKeys
– allKeysForObject:
– allValues
– getObjects:andKeys:
– objectForKey:
– objectsForKeys:notFoundMarker:
– valueForKey:

●辞書の列挙

– keyEnumerator
– objectEnumerator
– enumerateKeysAndObjectsUsingBlock:
– enumerateKeysAndObjectsWithOptions:usingBlock:

●辞書の並べ替え

– keysSortedByValueUsingSelector:
– keysSortedByValueUsingComparator:
– keysSortedByValueWithOptions:usingComparator:

●辞書のフィルタリング

– keysOfEntriesPassingTest:
– keysOfEntriesWithOptions:passingTest:

●辞書への格納

– writeToFile:atomically:
– writeToURL:atomically:

●ファイル属性へのアクセス

– fileCreationDate
– fileExtensionHidden
– fileGroupOwnerAccountID
– fileGroupOwnerAccountName
– fileHFSCreatorCode
– fileHFSTypeCode
– fileIsAppendOnly
– fileIsImmutable
– fileModificationDate
– fileOwnerAccountID
– fileOwnerAccountName
– filePosixPermissions
– fileSize
– fileSystemFileNumber
– fileSystemNumber
– fileType

●内容の生成

– description
– descriptionInStringsFileFormat
– descriptionWithLocale:
– descriptionWithLocale:indent:



●クラスメソッド

dictionary

+ (id)dictionary

空の辞書を新規作成し、返します。

このメソッドはNSDictionaryクラスのサブクラスであるNSMutableDictionaryを使用するために宣言されています。


dictionaryWithObjectsAndKeys:

+ (id)dictionaryWithObjectsAndKeys:(id)firstObject , ...

指定した値とキーのセットを登録して構成された辞書を生成して返します。

このメソッドはdictionaryWithObjects:forKey:と似ており、キーと値のペアで指定する方法のみ異なります。

例:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
    @"value1", @"key1", @"value2", @"key2", nil];

firstObject:新しい辞書に追加する最初の値を指定します。

...:firstObjectに対する最初のキーを指定し、以降は値とキーを交互に指定するnull終端のリストになります。
キーがnilの場合、NSInvalidArgumentExceptionが発生します。



●インスタンスメソッド

allKeys

- (NSArray *)allKeys

辞書のキーを含む新規配列を返します。

戻り値は辞書のキーを含む新規配列、または辞書に何も登録されていない場合は空配列になります。

配列内の要素の順序は定義されていません。


count

- (NSUInteger)count

辞書内のエントリ数を返します。


initWithContentsOfFile:

- (id)initWithContentsOfFile:(NSString *)path

指定したパスにあるファイル内のキーと値を使って、新規に辞書を割り当てて初期化します。

戻り値は、pathにある辞書を含む初期化された辞書(元のレシーバとは異なる場合があります)、またはファイルの内容の中に辞書として無効な表現が含まれていたりファイルにエラーがあった場合はnilを返します。

pathで示されるファイルの辞書は、プロパティリストオブジェクト(NSString、NSData、NSDate、NSNumber、NSArray、NSDictionaryオブジェクト)のみを含んで表されている必要があります。

詳細は『Property List Programming Guide』を参照してください。

辞書が可変であった場合でも、この辞書に含まれたオブジェクトは不変になります。

path:フルまたは相対パス名を指定します。
pathで示されるファイルは、文字列で表現されたプロパティリストを含む辞書のルートオブジェクトである必要があります。


initWithDictionary:copyItems:

- (id)initWithDictionary:(NSDictionary *)otherDictionary copyItems:(BOOL)flag

指定した別の辞書内に含まれているオブジェクトを使用して、新規に割り当てられた辞書を初期化します。

戻り値として初期化されたオブジェクトは、otherDictionaryで検出されたキーと値を含め、元のレシーバのオブジェクトと異なることがあります。

この方法で初期化された辞書は不変であり、変更することはできません。

copyWithZone:メソッドは浅いコピーを実行します。

任意の深さのコレクション場合、flagパラメータにYESを渡すと、表層下の最初のレベルは不変コピーが実行されます。

NOを渡すと最初のレベルが可変でも影響を受けません。

どちらの場合でも、より深いレベルにある可変は影響を受けません。

otherDictionary:新規の辞書を初期化するキーと値を含む辞書を指定します。

flag:YESの場合、otherDictionaryの各オブジェクトはcopyWithZone:メッセージを受け取ってオブジェクトのコピーを生成します。
オブジェクトはNSCopyingプロトコルに準拠している必要があります。
管理されたメモリ環境下では、retainメッセージの代わりにオブジェクトは受け取ります。
その後オブジェクトのコピーが返される辞書に追加されます。
NOの場合、管理されたメモリ環境下では、返される辞書に追加される時に、otherDictionaryの各オブジェクトは単純にretainメッセージを受け取ります。


initWithObjectsAndKeys:

- (id)initWithObjectsAndKeys:(id)firstObject , ...

指定したキーと値のセットからエントリを組み立てて、新規に割り当てた辞書を初期化します。

このメソッドはinitWithObjects:forKeys:に似ており、キーと値のペアで指定する点が異なっています。

例:

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
    @"value1", @"key1", @"value2", @"key2", nil];

firstObject:新規辞書に追加する最初の値を指定します。

...:最初にfirstObjectのキーを指定子、以降は値とキーを交互にしたnull終端のリストになります。
キーがnilの場合、NSInvalidArgumentExceptionが発生します。


objectForKey:

- (id)objectForKey:(id)aKey

指定したキーの値オブジェクトを返します。

キーに対応する値が無い場合はnilを返します。

aKey:取得する値のキーを指定します


valueForKey:

- (id)valueForKey:(NSString *)key

指定したキーに関連付けされた値を返します。

keyが『@』で始まっていない場合はobjectForKey:を呼び出します。

keyが『@』で始まっている場合は、『@』を取り除いた残りの部分で [super valueForKey:] を呼び出します。

key:対応する値を返すためのキーを指定します。
キー値コーディングを使用する場合、キーは文字列である必要があります。
(『Key-Value Coding Programming Guide』を参照してください)



参考文献

NSDictionary Class Reference






Bose SoundSport wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
02 | 2017/03 | 03
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
Recent Articles
iTunes


Swift
Categories
Tips
WACOM


Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
BOSE

Bose SoundSport wireless headphones
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
SQLite
OpenGL ES
Amazon


Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Profile

Author:水月杏香
永遠の初心者プログラマ。

QR Code
QR
Visitors