ObjecTips

Swift & Objective-C で iOS とか macOS とか

AppleScript の JavaScript for Automation で plist ファイルを作成する

上記の記事ではJSONファイルの書き出し保存を行った。
iOS でデータを扱う際には JSON より plist の方が読み込みが簡単なので plist 形式でのファイル保存もさらっておく。

plist の書き出しは NSArray or NSDictionarywriteToFile:atomically: で書き出せば良い。

NSArray から plist 書き出し

NSMutableArray を使って配列を組み立てて plist 書き出しを行う。
配列への値の設定は addObject: メソッドを用いる。
array[0] のように subscripting でアクセスする事はできない。

array = $.NSMutableArray.array;
array.addObject('abc');
array.addObject(123);

plist 書き出し

array.writeToFileAtomically(filePath.toString(), true);  
NSDictionary から plist 書き出し

NSMutableDictionary を使って辞書を組み立てて plist 書き出しを行う。
辞書への値の設定は setObject:forKey: メソッドを用いる。
dict['key'] のように subscripting でアクセスする事はできない。

dict = $.NSMutableDictionary.dictionary;
dict.setObjectForKey('abc', 'key1');
dict.setObjectForKey(123, 'key2');

plist 書き出し

array.writeToFileAtomically(filePath.toString(), true);
JavaScript の配列型、オブジェクト型から Objective-C の NSArray, NSDictionary に変換して plist 書き出し

上に書いた方法では配列と辞書の組み立てを全て Objective-C で行ったが、データ内容自体は JavaScript で組み立てて最後に Objective-C に渡して plist 書き出しする方法もある。
この方法だとデータの組み立てが JavaScript の文法で楽にできる。

まず JavaScript で適当に配列と辞書のデータを組み立てる。

array = [1, 2, 3];
array.push(['a', 'b', 'c']);
dict = {'key1': array};
dict['key2'] = 'xyz';
dict['key3'] = {'x': 1, 'y': 2, 'z': 3};


そして ObjC.wrap() 関数を用いて JavaScript の primitive なデータ型を Objective-C のオブジェクトに変換する。

object = ObjC.wrap(dict);

この時、変数 objectNSDictionary に変換されているので writeToFile:atomically: メソッドで書き出せば plist ファイルが作成される。

全体のコードは以下

Objective-C Bridge では NSArrayNSDictionary の subscripting を使用する事ができないので書きやすさとしてはこのように JavaScript でデータを組み立てて最終段階で Objective-C に渡す方が楽だと思う。
plist 書き出しの際は、plist に NSNull を入れる事ができないので、JavaScript でのデータ組み立ての際に null が入らないように注意する必要がある。