plistの使い道

androidアプリケーションで便利な機能の一つに様々構造のxmlをデータソースとして使えることだ。例えばarrays.xmlは配列構造のデータをデータソースとして供給できる。

arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string-array name="list_display">
    <item>Item 1</item>
    <item>Item 2</item>
    <item>Item 3</item>
  </string-array>
  <string-array name="list_item">
    <item>1</item>
    <item>2</item>
    <item>3</item>
  </string-array>
</resources>

アプリケーションからアクセスするには以下のイディオムを使う(Contextスコープ中で)

String[] diplayNames = getResources().getStringArray(R.array.list_display);
String[] listItems = getResources().getStringArray(R.array.list_item);

iOSにはarrays.xmlは無いが構造化されたデータとしてplistという形式を使用できる。
plistは(そうは見せていないが)中身はxmlファイルであり語彙の違いはあるものの、androidのarrays.xmlと同様の構造を使うことができるだろう。
Property List Programming Guide: Quick Start for Property Lists

arrays.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>list_display</key>
    <array>
        <string>Item 1</string>
        <string>Item 2</string>
        <string>Item 3</string>
    </array>
    <key>list_item</key>
    <array>
        <string>1</string>
        <string>2</string>
        <string>3</string>
    </array>
</dict>
</plist>

リファレンスを読めば解るがplistで特徴的なのはXMLエレメントがほぼクラスにマップされていることだ。

一般的な型名 XMLエレメント名 マップされているCocoaクラス
配列 NSArray
辞書 NSDictionary
文字列 NSString
データ NSData
日付 NSDate
数値-整数 NSNumber(intValue)
数値-浮動小数 NSNumber(floatValue)
ブール値 又は NSNumber(boolValue==YES又はNO)

読み出すコードはarrays.plistがメインバンドルに埋め込まれているとして、以下のようになるだろうか。

NSBundle* bundle = [NSBundle mainBundle];
NSString* path = [bundle pathForResource:@"arrays" ofType:@"plist"];
NSDictionary* dic = [NSDictionary dictionaryWithContentsOfFile:path];
NSArray* diplayNames =[dic objectForKey:@"list_display"];
NSArray* listItems = [dic objectForKey:@"list_item"];