0

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 的经验为零。

谢谢。

4

3 回答 3

1

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

编辑01:

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

#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 文档中的所有括号,我的眼睛就会流泪。

于 2010-02-21T01:19:45.900 回答
1

对 objc-appscript 手册的不完整表示歉意,如您所知,该手册最初是从 rb-appscript 移植的。(FWIW,今年春天我应该有时间在 appscript 上工作。)

首先将 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];
于 2010-02-25T19:53:57.717 回答
0

据我了解,这是打印每个拥有“sam.brown@foo.com”电子邮件的人的姓名。

如何在 Cocoa 中执行此操作没有直接关联。幸运的是,Address Book 是可编写脚本的,这意味着您可以使用Scripting Bridge 框架从 Cocoa 应用程序与其交互。

这个页面对如何通过 ScriptingBridge 简单地与 Mail.app 交互有一个非常好的解释:http ://robnapier.net/blog/scripting-bridge-265

希望这能给你足够的信息,让你朝着正确的方向前进。

于 2010-02-21T00:56:47.507 回答