Как бы я написал следующий rb-appscript в objc-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? Я прошу прощения, если это кажется слишком основным вопросом, у меня 0 опыта работы с Ruby.

Благодарю.

3 ответа

Решение

Если вы запускаете скрипт 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 заставляет мои глаза слезиться.

Извините за неполноту руководства 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];

Из того, что я понимаю, это печать имени каждого человека, у которого есть электронная почта "sam.brown@foo.com".

Там нет прямой корреляции для того, как это сделать в какао. К счастью для вас, адресная книга является сценарием, что означает, что вы можете использовать инфраструктуру Scripting Bridge для взаимодействия с ней из приложения Какао.

На этой странице есть отличное объяснение того, как просто взаимодействовать с Mail.app через ScriptingBridge: http://robnapier.net/blog/scripting-bridge-265

Надеюсь, это даст вам достаточно информации, чтобы двигаться в правильном направлении.

Другие вопросы по тегам