1) Правильно ли я сказал, что каждая (нестандартная) команда будет нуждаться в своем собственном классе для ответа на эту команду? И этот класс, вероятно, будет иметь только один метод.
Нет. Вы можете определить объект первого скрипта команды . В словаре сценариев используйте элемент <responds-to>
в классе, чтобы объявить, что он принимает команду и какой метод вызывать. Метод должен занять NSScriptCommand*
.
<class name="thing" code="tHNG" description="Something" plural="things">
<cocoa class="Thing" />
<responds-to name="do it">
<cocoa method="doIt:" />
</responds-to>
</class>
<command name="do it" code="You DOIT" description="Do it, whatever that happens to be.">
<direct-parameter type="thing" description="A thing." />
<result description="it's done" type="text" />
</command>
В каком-то заголовке:
@interface Thing (Scripting)
-(NSString*)doIt:(NSScriptCommand *)command;
При вызове в сценарии в качестве первого аргумента указывается объект соответствующего типа.
tell application "SomeApp"
do it thing 1
end
2) Как общепринятый способ общения этого класса с остальной частью программы? например, если я хочу, чтобы команда сообщила моему приложению сохранить, как объект сценария узнает об объекте, на который отправляются сообщения? Я вижу, как мой класс NSApplication устанавливает глобальное gApplication = this, а затем делает все через это, но это выглядит довольно глупо ...
Команды сценария с первым глаголом (что потребует создания подкласса NSScriptCommand) должны получить переданные им объекты, с которыми нужно работать, путем вызова NSScriptCommand
evaluatedArguments
метода. Любые объекты, с которыми вам нужно работать, должны быть доступны из аргументов. Если нет, то проблема с вашим дизайном.