我正在努力使我的应用程序可以编写脚本,我希望能够做的一件事是从我的应用软件中返回一个数组并将其返回到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上的好信息似乎很难找到!
一般来说,如果你想通过AppleScript返回一个项目列表,你可以如下设置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
方法结束时,您所需要做的就是返回一个标准的可可NSArray。Cocoa脚本自动将数组转换为AppleScript列表,将所有子元素转换为适当的形式。
-(id)performDefaultImplementation {
NSArray * resultArray
// do whatever that adds values to resultArray
return resultArray;
}
我担心的一点是,您似乎在处理通知,如果输出依赖于异步操作(如通知回复(,则可能需要开始考虑暂停和恢复apple事件。请记住,AppleScript不是线程化的,因此如果应用程序正在处理一个事件(等待异步操作(并接收到第二个事件,则结果是不确定的(并且可能令人不快(。