次期MacOSXのYosemiteからAutomationをAppleScriptではなくJavaScriptで書けるようになったというのは聞き及んでいましたが、Macアプリも作れるようになっていたとは知りませんでした。
どんな感じで書くの?
というわけでBUILDING OS X APPS WITH JAVASCRIPTという記事にチュートリアル形式でJavaScriptを利用したMacアプリの作り方が書いてあるので、詳しくはそちらを・・・といきたいと思ったのですが、
// 注:ウィンドウを表示するだけのサンプルコード ObjC.import("Cocoa"); var styleMask = $.NSTitledWindowMask | $.NSClosableWindowMask | $.NSMiniaturizableWindowMask; var windowHeight = 85; var windowWidth = 600; var ctrlsHeight = 80; var minWidth = 400; var minHeight = 340; var window = $.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer( $.NSMakeRect(0, 0, windowWidth, windowHeight), styleMask, $.NSBackingStoreBuffered, false ); window.center; window.title = "Choose and Display Image"; window.makeKeyAndOrderFront(window);
このコードを見るやいなや立ち昇るCocoa臭。$.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer
というコードからはRubyMotionでiOSアプリを作っていた頃を思い出します。
何のことはなく、JavaScriptっぽく書けるというよりは、JavaScriptで書けるだけということなんですね。今ならSwiftがあるし、ObjectiveC嫌ならSwiftで良いじゃんとも思う。何よりCocoaは、補完きかないと書く気がしないですよねー。。
あと、ボタンクリックのイベントハンドラを作るのに、
ObjC.registerSubclass({ name: "FooViewController", methods: { "btnClickHandler": { types: ["void", ["id"]], implementation: function (sender) { $.NSLog("Clicked!"); } } } }); var viewController = $.FooViewController.alloc.init; var btn = $.NSButton.alloc.initWithFrame($.NSMakeRect(230, (windowHeight - 62), 150, 25)); btn.title = "Choose an Image..."; btn.bezelStyle = $.NSRoundedBezelStyle; btn.buttonType = $.NSMomentaryLightButton; btn.target = viewController; btn.action = "btnClickHandler";
こんな感じのコードを書かなければいけないのは、ちょっとつらい気が。registerSubclassがおもいっきりObjectiveC感出てる。
メリットとしては、ちょっとしたアプリを作りたいときにいちいちViewControllerだの作る必要なく、スクリプト気分(いや、スクリプトだけど)で(ハマらなければ)サクッと書けることですかね。いっそRubyMotionでRubyで書きたいところですが、RubyMotion有料ですしね。あとは、ちょっとしたラッパーを書けば生産性上がるのかも知れない。