我如何在objc-appscript中编写以下rb-appscript?

时间:2010-02-20 23:29:02

标签: objective-c cocoa appscript rb-appscript

appscript objc-trunk中的文档在“性能问题”一节中随机使用ruby。

require "appscript"
include Appscript

desiredEmail = 'sam.brown@foo.com'

p app('Address Book').people[
        its.emails.value.contains(desiredEmail)
        ].name.get

如何用Objective-C编写?如果这看起来像是一个过于基本的问题,我很抱歉,我对Ruby有经验。

感谢。

3 个答案:

答案 0 :(得分:1)

如果你运行ruby脚本并使用ASTranslate,它应该将原始appscript命令转换为Objc-appscript。

Edit01:

我认为它看起来像这样。我没有运行工具来制作胶水代码所以我猜测应用程序名称的显示方式。

#import "AddressBookGlue.h" //Dont know the precise name 

AddressBookApplication *abApp=[[AddressBookApplication alloc] initWithName: @"Address Book.app"];

NSString *desiredEmail=@"sam.brown@foo.com"

NSString *returnedName= [[[[[[abApp people] emails] value] contains:desiredEmail] name] get]; 

基本上,它遵循Objectic-c在从点语法转换时使用的相同规则:在原始语法中存在点的任何地方,期望Objective-C中的括号。

我可能会补充说,如果你要做很多这种类型的脚本编写,最好花一两天时间学习ruby或python的基础知识。使用点语法比使用嵌套语法更容易使用OSA。只要查看Objc-appscript文档中的所有括号,我的眼睛都会流水。

答案 1 :(得分:1)

对于objc-appscript手册的不完整性表示道歉,最初从rb-appscript移植到你可以看出来。 (FWIW,我今年春天应该有时间研究应用程序。)

首先将Ruby代码转换回AppleScript可能是最简单的方法:

tell application "Address Book"
   get name of every person where value of its email contains "hengist.podd@virgin.net"
end tell

通过ASTranslate运行它给出了这个:

#import "ABGlue/ABGlue.h"
ABApplication *addressBook = [ABApplication applicationWithName: @"Address Book"];
ABReference *ref = [[[addressBook people] byTest: [[[ABIts emails] value] contains: @"hengist.podd@virgin.net"]] name];
id result = [ref getItem];

答案 2 :(得分:0)

根据我的理解,这是打印每个发送电子邮件为“sam.brown@foo.com”的人的姓名。

在Cocoa中如何做到这一点并没有直接的关联。幸运的是,Address Book是可编写脚本的,这意味着您可以使用Scripting Bridge framework从Cocoa应用程序与它进行交互。

此页面对如何通过ScriptingBridge与Mail.app进行简单交互提供了非常好的解释:http://robnapier.net/blog/scripting-bridge-265

希望这能为您提供足够的信息以便朝着正确的方向前进。