我怎样才能从我的可编写脚本的程序中 return 一个数组到 AppleScript 中?

How can I return an array into AppleScript from my scriptable program?

我正在尝试使我的应用程序可编写脚本,我希望能够做的一件事是 return 从我的应用程序到 AppleScript 的一个数组,以便它可以被处理更远的地方。我想我可以通过 return 计算数组的计数,然后让 AppleScript 从 1 到 n 迭代到 return 数组中的每个项目来做到这一点——但我认为这不会是效率很高。

我的代码目前是这样的:

sdef 文件的相关部分

        <command name="List" code="lflecont" description="List file types found in data stream">
            <cocoa class="ListDataContentCommand"/>
            <result description="an array containing the types of all the data blocks in the File">
                <type type="any" list="yes"/>
            </result>
        </command>

ListDataContentCommand.h

@interface ListDataContentCommand : NSScriptCommand

@end

ListDataContentCommand.m

@implementation ListDataContentCommand

-(id)performDefaultImplementation {
    return @[@"Jam",@"Fish",@"Eggs"];
}

@end

为了对此进行测试,我创建了以下简单的 AppleScript…

tell application "Data Dump"
    open "/Volumes/Test Data/test.dat"
    set theList to List
end tell

这 return 是一个错误 - error "Data Dump got an error: Can’t continue List." number -1708

如何让我的数组输出?

就此而言,如何 return 编辑 NSDictionary?或者那是不可能的? NSString 可以 return 直接转换为文本吗?还是需要先将其转换为 Cstring?

新手问题,恐怕,但关于 AppleScript 的好资料似乎很难获得!

一般来说,如果您想通过 AppleScript return 项目列表,您可以按如下方式设置 sdef 的命令 XML,将 result 元素扩展为一个块,然后包括一个 type 元素,其 list 属性设置为 'yes':

<command name="List" code="lflecont" description="List file types found in data stream">
    <cocoa class="ListDataContentCommand"/>
    <result description="an array containing the types of all the data blocks in the File">
        <type type="any" list="yes"/>
    </result>
</command>

然后在您的 performDefaultImplementation 方法结束时,您需要做的就是 return 一个标准的 cocoa NSArray。 Cocoa 脚本自动将数组转换为 AppleScript 列表,将所有子元素转换为适当的形式。

-(id)performDefaultImplementation {
    NSArray * resultArray

    // do whatever that adds values to resultArray
    return resultArray;
}

我担心的一个问题是您似乎在用通知做某事,如果输出取决于异步操作(如通知回复),您可能需要开始考虑暂停和恢复苹果事件。请记住,AppleScript 不是线程化的,因此如果应用程序正在处理一个事件(等待异步操作)并接收到第二个事件,则结果是不确定的(并且可能令人不快)。