2010年5月15日土曜日

プロパティリストからキーで配列を取得する

プロパティリストからキーを使って配列を取得するには、以下の手順で取得します。

  1.  メインバンドルを取得する
  2. プロパティリストのファイル名からフルパスを取得する
  3. フルパスを指定してプロパティリストの内容をディレクトリとして取得する。
  4. キーを取得する。
  5. キーをつかって、キーに該当する値を配列として取得する

もちろん、初期化時にディレクトリを保持したり、キー配列を保持したり、配列の初期値を入れることは必要です。(1〜3に該当)

例:

- (void)viewDidLoad {
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc]initWithContentsOfFile:plistPath];
self.stateZips = dictionary;
[dictionary release];
NSArray *components = [self.stateZips allKeys];
NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
self.states = sorted;
NSString *selectedState = [self.states objectAtIndex:0];
NSArray *array = [stateZips objectForKey:selectedState];
self.zips = array;
}

プロパティリスト

プロパティリストは、iPhone等のシステムやアプリケーションで利用する表のようなもので、複数のキーと複数の値からなります。

キーとは、表の列のタイトルのようなもので、ディクショナリ形式として読み込んだプロパティリストの表の中から列のデータ全てを配列として取り込む際、当該列を指定するキーとして利用するもので、そのキーを指定すれば、その列の値全てを配列として取り出すことができます。



iPhoneのシステム用プロパティについての翻訳サイトがあるようなので、ご紹介します。

iPhoneで良く使われるディレクトリとPathの取得



セキュリティのため、アプリケーションが書き込むことのできる場所は数か所だけです。アプリケーションが実装されるとアプリケーションのためのホームディレクトリが作成されます。
詳細はここを参照。
iPhoneアプリケーションのディレクトリ


ディレクトリ
説明
/AppName.app
アプリケーション自体を含むバンドルディレクトリ。アプリケーションは署名されている必要があるため、実行時にこのディレクトリの内容を変更してはなりません。変更を加えると、後でアプリケーションを起動できなくなります。
→すなわち、icon.pngファイルを書き換えることはできない
iPhone OS 2.1以降では、このディレクトリの内容がiTunesによってバックアップされません。ただし、App Storeから購入したアプリケーションの最初の同期はiTunesによって実行されます。
/Documents/
データファイルを書き込むために使用するディレクトリ。ユーザデータや、定期的にバックアップする必要があるその他のデータを保存するために、このディレクトリを使用します。
このディレクトリの内容はiTunesによってバックアップされます。
/Library/Preferences
環境設定ファイルを保存。環境設定ファイルを直接作成しないでください。その代わりに、NSUserDefaultsクラスまたはCFPreferencesAPIを使用して、アプリケーションの環境設定を取得したり設定したりします(「Settingsバンドルの追加」を参照)。
このディレクトリの内容はiTunesによってバックアップされます。
/Library/Caches
アプリケーションが終了しても次の起動まで保持しておきたいアプリケーション固有のサポートファイルを書き込む。ただし、iTunesは、デバイスの完全復元中にこれらのファイルを削除するので、必要に応じて再作成する必要がある。
iPhone OS 2.2以降では、このディレクトリの内容がiTunesによってバックアップされません。
/tmp/
アプリケーションが終了しても次の起動まで保持しておきたい一時ファイルを書き込む。
iPhone OS 2.1以降では、このディレクトリの内容がiTunesによってバックアップされません。

FoundationフレームワークのNSHomeDirectory関数は、最上位のホームディレクトリ、つまり、アプリケーション、DocumentsLibrary、およびtmpの各ディレクトリを含んでいるディレクトリへのパスを返します。この関数のほかに、NSSearchPathForDirectoriesInDomains関数およびNSTemporaryDirectory関数を使って、DocumentsCaches、およびtmpの各ディレクトリへのパスを取得することもできます。
NSSearchPathForDirectoriesInDomains関数は、もともとMac OS X用に設計されているため、1つのパスではなくパスの配列を返します。iPhone OSでは、その結果の配列に、要求したディレクトリへのパスが1つ含まれています。
アプリケーションのDocuments/ディレクトリへのファイルシステムパスの取得

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
ユーザの環境設定を読み書きするには、NSUserDefaultsクラスまたはCFPreferences APIを使用します。これらのインターフェイスにより、Library/Preferences/ディレクトリへのパスを作成したり、環境設定ファイルのディレクトリへ読み書きしたりする必要がなくなります。これらのインターフェイスの使用の詳細については、「Settingsバンドルの追加」を参照してください。
アプリケーションバンドルにサウンド、画像、またはその他のリソースが含まれている場合には、NSBundleクラスまたはCFBundle不透過型を使用してこれらのリソースをロードする必要があります。バンドルは、アプリケーション内のリソースの格納場所についてもともと情報を備えています。加えて、バンドルはユーザの言語に関する環境設定を認識し、デフォルトのリソースの代わりにローカライズ済みのリソースを自動的に優先して選択することができます。バンドルの詳細については、「アプリケーションバンドル」を参照してください。

CoCoaリファレンス

CoCoaのリファレンスを作っている人がいました。最新かどうかわかりませんが、参考になります。


http://d.hatena.ne.jp/jjj777/

@selector

@selector宣言は、異なるオブジェクトのメソッドの利用をコンパイラに指示する宣言のようです。

例:

-(NSArray *) sortedArrayUsingSelector:(SEL)comparator


配列内の要素を比較して、昇順にソートされた配列を返します。
NSStringの-caseInsensitiveCompare:や-compare:などNSComparisonResultを返すメソッドが使えます。
比較関数メソッドは2つの要素を比較してレシーバが引数よりも小さい時は  NSOrderedAscendingを、大きい時はNSOrderedDescendingを、同じ時はNSOrderedSameを返すようにします。

文字列の比較の場合、NSStringでcompare:が定義されているので以下の要領でソートした新しい配列を得ることができます。


NSArray *newArray = [theArray sortedArrayUsingSelector:@selector(compare:)];

2010年5月13日木曜日

NSDictionary

一般的に配列には、機械的な連番(インデックス)で要素を管理する「通常配列」と、意味のあるキーワード(キー)を目印として要素(値)を管理する「連想配列」の2種類があります。Objective-Cでは、NSArrayやNSMutableArrayで通常配列を実現する一方、「NSDictionary」と「NSMutableDictionary」で連想配列を実現することができます。また、これらのクラス名が表すとおり、Objective-Cでは連想配列のことを「ディクショナリ(辞書)」と表現します。

NSDictionaryは内容が固定、NSMutableDictionaryは内容が可変のディクショナリを実現します。
(参考)http://www.atmarkit.co.jp/fcoding/articles/objc/05/objc05c.html

適合プロトコル



NSCoding
  – encodeWithCoder:
  – initWithCoder:
NSCopying
  – copyWithZone:
NSMutableCopying
  – mutableCopyWithZone:
NSFastEnumeration
    – countByEnumeratingWithState:objects:count:
メソッド等
ディクショナリを生成する
+ dictionary
+ dictionaryWithContentsOfFile:
+ dictionaryWithContentsOfURL:
+ dictionaryWithDictionary:
+ dictionaryWithObject:forKey:
+ dictionaryWithObjects:forKeys:
+ dictionaryWithObjects:forKeys:count:
+ (id)dictionaryWithObjectsAndKeys:


ディクショナリのインスタンスを初期化する
– (id)initWithContentsOfFile:(NSString *)path
 pathで指定したファイルに格納されたキーと値でディレクトリを初期化する。
– initWithContentsOfURL:
– initWithDictionary:
– initWithDictionary:copyItems:
– initWithObjects:forKeys:
– initWithObjects:forKeys:count:
– (id)initWithObjectsAndKeys:(id)Object,key,....,nil;

ex.
NSDictionary *row1 = [[NSDictionary allocinitWithObjectsAndKeys:@"MacBook",@"Name",@"White",@"Color",nil];

登録情報をカウントする

ディクショナリを比較する

キーと値にアクセスする
レシーバに含まれる全てのキーを配列として取得する

ディクショナリをエミュレートする

ディクショナリをソートする

ディクショナリをストアする

ファイル属性にアクセスする

表記を生成する