Cocoa-Applescriptがずいぶん変わっててビックリなどしたこと

以前にiTunesをアラームでコントロールしたい、というありがちな理由で少しいじってみた AppleScriptなんだけど、しばらくいじってないうちにだいぶ変わっていたらしい。
例によって備忘録。
間違ってたらツッコミしていただけるとウレシいです。
あとタイトル変だね。Cocoa-AppleScriptが変わってた訳じゃなくて、Cocoa-AppleScript「に」変わってたんだったごめんなさい。

どう変わったのか

以前の環境はAppleScript Studioと呼ばれていたらしい*1。で、よりCocoa親和性を高めた(?)環境がCocoa-AppleScript Applicationという環境らしく、XCodeのテンプレートも*2それになっている。
主な変化点はInterface BuilderのAppleScriptタブが無くなった事と、それに伴ってイベント処理と名前付けが変更された事。一応、以前のような使い方をしたければ

defaults write com.apple.InterfaceBuilder3 IBEnableAppleScriptStudioSupport -bool YES

とすればIBにAppleScriptタブが出てきて使う事ができる。けれども、郷に行っては郷に従え、他のCocoa開発との親和性を考えると、やはりここはあえて NOと言うべき。

具体的な差

bold;font-size:xx-large;">以前:AppleScriptタブにてスクリプトで使う名前を設定。同じくAppleScriptタブにてイベントを紐付け。
bold;font-size:xx-large">今:スクリプト中にproperty宣言をしたものがIB上でDelegateのOutletとして見えるのでそれを使って接続。イベントハンドラスクリプト中にonで宣言した名前がactionとして見える(名前の後ろに_がいるらしい。良くわかってない)のでこれを接続。

で、実際やってみた

ありがちな通貨換算プログラム書いてみた。レートの参照は以下を使ってみた。
http://www.exchangerate-api.com/
使い方は簡単で、各通貨に対応した3letters-codeを/SRC/DST/のようにいれてやるだけで文字列としてレートを返してくれる。
まずはOutletから。

	property srccurr : missing value -- source currency code
	property dstcurr : missing value -- distination currency code
	property srctext : missing value
	property dsttext : missing value

でIBでつないでみる。

おお、ちゃんと出ている!
次にActionを書く。

	on dstchanged_(sender)
		set the c to dsttext's floatValue()
		tell srctext to setFloatValue_(c / rate)
	end dstchanged_
	
	on srcChanged_(sender)
		set the c to srctext's floatValue()
		tell dsttext to setFloatValue_(c * rate)
	end srcChanged_
	on currencyChanged_(sender)
		set src to title of srccurr as string
		set dst to title of dstcurr as string
		  :
                  :		
	end currencyChanged_

同じように、IBにて・・・

おぉぉぉぉぉぉぉぉ!簡単。

感動

簡単すぐる。

でけた。
ちなみに、ポップアップにあるCurrency Codeは62個あるんだけど、どうしたかというと'REPLACE'という文字をコピりまくって62個つくり、出てきた xibファイルを直接perlで書き換えた MainMenu.xib ">*3
まだバグというか問題があって一度formatter付きテキストにして、換算レートの精度を落としてしまっているので、小さい方の通貨から大きい方の通貨に行ったり来たりすると誤差で変になるけど「仕様です」

https://github.com/tkuro11/CurrencyConverter_AppleScript

結論

とりあえず非常に簡単。Obj-Cでの開発と親和性が高くなって個人的には覚えやすくなったと思う。
あとは、AppleScriptがもう意味フー

*1:意識してなかった

*2:やっぱり意識してなかったけど...

*3: one-linerでやってしまった。手抜き。。 perl -e 'open(CUR, "cur.list"); @cur = ; chomp @cur; open(XIB, "MainMenu.xib.bak"); while() {s/REPLACE/shift @cur/e; print}' > MainMenu.xib