1

Swift アプリケーションを呼び出して値を取得する AppleScript を作成しようとしています。このメソッドは文字列を受け取り、別の文字列を返す必要があります。

これが私の.SDFファイルです:

<suite name="My Suite" code="MySU" description="My AppleScript suite.">
    <class name="application" code="capp" description="An application's top level scripting object.">
        <cocoa class="NSApplication"/>
        <element type="my types" access="r">
            <cocoa key="types"/>
        </element>
    </class>

    <command name="my command" code="MyCOMMND" description="My Command">
        <parameter name="with" code="MyPR" description="my Parameter" type="text">   
            <cocoa key="myParameter"/>
        </parameter>
        <result type="text" description="the return value"/>

        <cocoa method="myCommand:"/>
    </command>
</suite>

対応する Swift コードはかなり単純です。

func myCommand(_ command: NSScriptCommand) -> String
{
    if let myParameter = command.evaluatedArguments?["myParameter"] as? String
    {
        return "Hello World!"
    }
    else
    {
        return "Nothing happening here. Move on."
    }
}

そして最後に私のAppleScriptはここにあります:

tell application "MyApp"
    set r to my command with "Hello"
end tell

AppleScript を実行すると、コマンドは認識されますが、関連付けようとした Swift コードが呼び出されません。Xcode も AppleScript も問題を報告しません。何かを見逃したり、コードを間違った場所に置いたりしていませんか?

4

1 に答える 1

2

この種のスクリプトでは、試みているオブジェクト ファーストのアプローチではなく、コマンド ファースト (動詞ファースト) のアプローチをお勧めします。sdef は次のようになります (「MyProject」をプロジェクトの名前、つまりアプリケーションの Swift モジュール名に置き換えます):

<dictionary xmlns:xi="http://www.w3.org/2003/XInclude">
<suite name="My Suite" code="MySU" description="My AppleScript suite.">

    <command name="my command" code="MySUCMND" description="My Command">
        <cocoa class="MyProject.MyCommand"/>
        <parameter name="with" code="MyPR" description="my Parameter" type="text">   
            <cocoa key="myParameter"/>
        </parameter>
        <result type="text" description="the return value"/>
    </command>

</suite>
</dictionary>

クラスは次のMyCommandようになります。

class MyCommand : NSScriptCommand {

    override func performDefaultImplementation() -> Any? {
        if let _ = self.evaluatedArguments?["myParameter"] as? String
        {
            return "Hello World!"
        }
        else
        {
            return "Nothing happening here. Move on."
        }

    }
}

「ModuleName.ClassName」sdef のヒントは、Swift NSScriptCommand performDefaultImplementationから来ています。

于 2016-12-05T16:28:57.560 に答える