【问题标题】:How can I return an array into AppleScript from my scriptable program?如何从可编写脚本的程序中将数组返回到 AppleScript?
【发布时间】:2021-03-25 02:54:40
【问题描述】:

我正在尝试使我的应用程序可编写脚本,我想做的一件事是从我的应用程序返回一个数组并进入 AppleScript,以便可以在那里进一步处理它。我想我可以通过返回数组的计数来做到这一点,然后让 AppleScript 从 1 迭代到 n 以返回数组中的每个项目 - 但我认为这不会非常有效。

我的代码目前如下所示:

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

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

如何让我的数组输出?

就此而言,如何返回 NSDictionary?或者那是不可能的? NSString 是否可以直接返回文本 - 还是需要先转换为 Cstring?

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

【问题讨论】:

  • 通常标准类型 NSStringNSNumberNSDate 隐式桥接到 AppleScript 类型。默认情况下,AppleScript 同步工作,ListDataContentCommand 脚本命令返回nil(AppleScript 端为missing value)。如果您需要异步处理,您必须在当前脚本命令上调用suspendresume。真正的返回类型是什么?如果您使用any,则必须返回NSAppleEventDescriptor。要返回字典,您必须在 sdef 文件中创建 record-type
  • 所以要返回一个 NSArray,我必须将它设置为返回一个列表(在 sdef 中)?我理解正确吗?
  • 不,定义真正的返回类型并添加list="yes"id 返回类型也涵盖 NSArray

标签: objective-c cocoa applescript


【解决方案1】:

一般来说,如果你想通过 AppleScript 返回一个项目列表,你可以如下设置 sdef 的命令 XML,将 result 元素扩展为一个块,并包含一个带有 list 属性的 type 元素设置为“是”:

<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 方法结束时,您需要做的就是返回一个标准的可可NSArray。 Cocoa 脚本自动将数组转换为 AppleScript 列表,将所有子元素转换为适当的形式。

-(id)performDefaultImplementation {
    NSArray * resultArray

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

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

【讨论】:

  • 谢谢你。我已经更新了这个问题 - 因为,为了简化问题并测试我所拥有的,我按照你说的做了 - 我得到了一个无法继续...
  • @headbanger:仅仅因为这是个好主意,您可能不应该将命令称为“列表”; AppleScript 区分大小写,但它太接近 AS 定义的“列表”对象。另外,你不应该无故大写。尝试重命名命令“列表类型”,看看是否可以解决任何问题。此外,在进行 SDEF 更改时退出并重新打开脚本编辑器;脚本编辑器缓存脚本信息,所以你需要强制它更新。
  • @headbanger:今晚我得做一些实验。我当前可编写脚本的应用程序项目中的所有命令都返回对象而不是值,所以我需要模拟一些东西。
  • 感谢您的建议 - 我将其更改为 list_objects,但错误是一样的。也就是说,如果我返回 @[] 那么它很高兴 - 它显示一个空列表。这可能是一个线索
  • @headbanger:您可以尝试(作为测试)将类型属性设置为 type="text" 并查看是否会改变。如果这是问题所在,您可能需要显式为回复苹果事件创建并返回一个苹果事件描述符(在任何情况下,当您使用类型“任何”时)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 2019-12-18
相关资源
最近更新 更多