ObjecTips

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

AppleScript の JavaScript for Automation でテキストをファイルに保存する Objective-C Bridge編

前回の記事

前回は AppleScript の StandardAdditions を使ってテキストファイルの書き出し保存を行ったが、
まずどんな関数があるのか、そして関数の引数や実行時の挙動等を調べるのに手間がかかった。
JavaScript for Automation では Objective-C Bridge というものが使えるので、iOS OSX での開発経験があればこれを使った方が簡単かも知れない。

文法

まず使用したいフレームワークを import する

ObjC.import('Cocoa')


Objective-C の機能にアクセスするには $. を前に付ける

NSObjectalloc init する例

object = $.NSObject.alloc.init


NSStringstringWithFormat で生成する例

string = $.NSString.stringWithFormat('%@ to %@', 'abc', 'xyz')
// abc to xyz


引数に可変引数を取る場合は、それぞれの値が同じ型でないといけないという 制約があって数値と文字列を混在させる事ができないので注意。
JavaScript の機能を使って format 指定の文字列を生成する事ができるので、あまり問題にはならないと思う。

string = $.NSString.stringWithString(123 + ' ' + 'to' + ' ' + 'xyz')
// 123 to xyz


詳しくは公式リファレンスを参照
JavaScript for Automation Release Notes

保存ダイアログを表示する

NSSavePanel を呼び出してみたところ Script Editor がハングしてどうもダイアログが開かない。
本当は全て Objective-C Bridge で書きたかったけど、ダイアログの箇所は前回同様 AppleScript の StandardAdditions で書く事にする。

テキストをファイルに保存する

ここは Objective-C でだいぶシンプルになる。
NSString を用意して writeToFile:atomically: メソッドを使ってテキストを書き出す。これだけでOK。
メソッド名から関数名への変換は、メソッド名全体をキャメルケースで繋げて引数を順番に入れていくという形を取る。

string = $.NSString.stringWithString('asdf');
string.writeToFileAtomically(filePath.toString(), true);

ファイルのオープンクローズの処理が必要無く楽に書ける。

まとめ

今回は Objective-C ではちょっとした処理しか行わなかったけど、Objective-C Bridge を使えば OS X 内の様々な Objective-C framework の機能を組み合わせて使う事ができるので AppleScript だけでは実現が難しかった事もいろいろとできそう。