OS X YosemiteからJSでMacアプリを作れるようになったって!?と聞いてみたものの

次期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有料ですしね。あとは、ちょっとしたラッパーを書けば生産性上がるのかも知れない。