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
でもキーワード引数をつけるなら、引数を関数名にするのがみそらしい
参考資料
すごくわかり易い例がいっぱいあって助かりました。