パラメータ付きのハンドラの存在確認を行い、間接的に呼び出しを行うAppleScriptです。
ハンドラの間接呼び出しについては、最近研究を重ねておりました。過去の事例をまとめ、ノウハウの方向性を分析。
過去の事例はPure AppleScriptについてのものであり、今日Cocoaの機能を呼び出すAppleScriptObjCの環境で使えないものを紹介しても仕方がありません。もはや、Cocoaの機能呼び出しとAppleScriptは不可分のレベルです。
そんなわけで、AppleScriptObjC環境でのハンドラの間接呼び出しについて試行錯誤と検討を重ね、ハンドラの存在確認とパラメータつきハンドラの間接呼び出しができるようになってきました。
AppleScript名:ASOCでハンドラの間接呼び出し v3b |
–By @badcharanさん use framework "Foundation" use scripting additions set nameOfTargetHandler to "aHandler:" set aParamObj to {1, 2, 3} set existsHandler to (me’s respondsToSelector:nameOfTargetHandler) as boolean if existsHandler = true then set aRes to (my performSelector:nameOfTargetHandler withObject:aParamObj) as list of string or string else error "The Handler \"" & nameOfTargetHandler & "\" is not present in this Script." end if return aRes on x() return "hello" end x on aHandler:(aParam as list of string or string) return length of aParam end aHandler: |
「as anything」がmacOS 10.13までは「as list ot list of string」などと解釈されていましたが、macOS 10.14からは「as anything」(Script Editor)あるいは「as any」(Script Debugger)と解釈されるようになりました。このあたり、足並み揃えてほしいところですが……
とりあえず、macOS 10.14移行の環境(Script Editor)で動く(正しく解釈される)ように少し書き換えてみました。
AppleScript名:ASOCでハンドラの間接呼び出し v3c.scpt |
–By @badcharanさん use framework "Foundation" use scripting additions set nameOfTargetHandler to "aHandler:" set aParamObj to {1, 2, 3} set existsHandler to (me’s respondsToSelector:nameOfTargetHandler) as boolean if existsHandler = true then set aRes to (my performSelector:nameOfTargetHandler withObject:aParamObj) as anything –Script Editor, "any" for Script Debugger else error "The Handler \"" & nameOfTargetHandler & "\" is not present in this Script." end if return aRes on x() return "hello" end x on aHandler:(aParam as anything) –Script Editor, "any" for Script Debugger return length of aParam end aHandler: |