それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

JXAのJavaScript AutomationとObjc Cocoaのオブジェクト呼び出し例

JXA で NSString を使ってPATHの変換をしてみたのでメモ

objcのCocoa から NSString と FileManager を使ったので、いろいろ知見を得られたのでメモ。

Javascriptで、NSString を使うには、次のようにする。

ObjC.import('Cocoa')

NSStringを init して alloc する

## [[NSString alloc] init]
$.NSString.alloc.init

JS の文字列から NSString に変換する。

// [[NSString alloc] initWithUTF8String:"Hello world"];
nsStr = $.NSString.alloc.initWithUTF8String("Hello World.");

NSString から JS の文字列に変換する

JS文字列は基本的にObjC→C言語へ変換するのと同じ

// [@"Hello world" UTF8String]
var str = nsStr.UTF8String;

メソッドを呼び出す。

nsStr = $.alloc.initWithUTF8String("/Users/takuya/.bashrc")
nsStr = nsStr.stringByStandardizingPath
nsStr = nsStr.stringByStandardizingPath.UTF8String;

メソッドの呼び出しは CoCoa を書いてるときみたいに書けばいい。むしろ最後の丸括弧を除去した方がいいところが面喰らう的な。getter/setter なんかも同じ。

ポインタを引数に取るメソッドを使うとき、キーワード引数を使うとき

// - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;

mgr = $.NSFileManager.defaultManager;
var isDir= Ref();
mgr.fileExistsAtPathIsDirectory(e,isDir) && isDir[0]

変数のポインタを扱うのは var ptr = Ref() で、デリファレンスするのは ptr[0] のように配列の中身を見る感じっぽい 同じ関数 fileExistsAtPath でもキーワード引数をつけるなら、引数を関数名にするのがみそらしい

参考資料

すごくわかり易い例がいっぱいあって助かりました。

http://palepoli.skr.jp/tips/javascript/jxa.php