我怎样才能从我的可编写脚本的程序中 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 不是线程化的,因此如果应用程序正在处理一个事件(等待异步操作)并接收到第二个事件,则结果是不确定的(并且可能令人不快)。
我正在尝试使我的应用程序可编写脚本,我希望能够做的一件事是 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 不是线程化的,因此如果应用程序正在处理一个事件(等待异步操作)并接收到第二个事件,则结果是不确定的(并且可能令人不快)。