AppleScript: получение списка всех свойств объекта или класса - PullRequest
8 голосов
/ 21 ноября 2010

Чтобы сохранить значения объекта для внешнего (вне AS) доступа, мне нужно иметь возможность получить каждое свойство этого объекта, а затем я попытаюсь привести его к тексту и сохранить его где-нибудь.

Как получить список свойств, которые содержит объект. В качестве примера я могу написать это:

tell me
  get properties
end tell

Это работает для сценария объекта.

Но для многих других объектов я просто получаю сообщение об ошибке типа «несоответствие типов дескрипторов», как здесь:

tell application "iTunes"
  get properties of file track 1
end tell

Теперь я знаю, что превосходный Script Debugger может сделать это (он может показать весь набор свойств любого объекта), так что это должно быть возможно и в написанном AppleScript. В чем секрет?

Ответы [ 4 ]

8 голосов
/ 25 ноября 2010

Марк Олдритт, автор Script Debugger, был так любезен, объяснив мне «секрет».

Отладчик сценариев использует некоторые специальные функции AppleScript API, включая OSAGetPropertyNames (), чтобы получить эту информацию.

Следовательно, если я напишу обертку, например, в C, я, вероятно, тоже смогу добраться до этого.

Обновление

В API сценариев Какао есть специальные классы для этого (NSScriptSuiteRegistry и NSScriptClassDescription) - платформа создает эту информацию из чтения файла определения сценария приложения (.sdef). При этом все доступные классы и их свойства могут быть изучены довольно легко.

4 голосов
/ 04 апреля 2016

Возможность для приложения возвращать свойство "properties" существовала всегда, но до появления Какао требовалось значительно больше работы, чем после. До появления Cocoa разработчик должен был создать структуру AEList, заполненную ключами и значениями для каждого свойства, а затем вернуть ее в дескрипторе typePropertyList. Многие разработчики не беспокоили. С помощью сценариев Cocoa вы в основном получаете это бесплатно КАК ДОЛГО, КАК вы используете KVC-совместимые имена для всех свойств вашего класса И вы получаете терминологию и ключи какао в вашем SDEF-файле, правильно настроенном.

Кстати, в 2016 году, iTunes 12.3.3,

tell application "iTunes" to get properties of file track 1

правильно возвращает длинный список свойств.

4 голосов
/ 22 ноября 2010

Script Debugger - это Applescript, просто с кучей инструментов программирования, размещенных вокруг него.Но «несоответствие типов дескрипторов» действительно не должно входить в это.Можете ли вы показать свой код, потому что в Script Editor это прекрасно работает:

tell application "Finder"
    set theFile to choose file
    get properties of theFile -- the "return" keyword also works here as well
end tell

Различные приложения будут вести себя по-разному, но без примера кода слишком много вариантов, чтобы сказать однозначно. Обновление за комментарий и обновленный вопрос: Опять же, разные приложения ведут себя по-разному.На самом деле приложение должно иметь свойство properties, чтобы возвращать вам запись (хотя иногда это отличается от другой информации, которую можно получить от объекта).Как правило, это реализовано в корневом классе - в большинстве случаев item;iTunes не позволяет этого.Даже Script Debugger не может обойти это.

3 голосов
/ 26 октября 2012

Есть хитрость, которую вы можете использовать, потому что вы можете заставить Applescript сообщать вам об ошибке, и этот текст включает в себя свойства объекта, который был целью.

set myThing to {FirstName:"Fred", LastName:"Smith"}
ListProperties(myThing)
on ListProperties(MyObject)
try
    get properties of MyObject
on error errText number errNum
    set pStart to offset of "{" in errText
    set structure to text pStart thru ((length of errText) - 2) of errText
    set TIDL to AppleScript's text item delimiters
    set AppleScript's text item delimiters to ","
    set fields to text items of structure as list
    set myMessage to ""
    repeat with f from 1 to count of fields
        set AppleScript's text item delimiters to ":"
        set theseItems to text items of (item f of fields) as list
        set itemPropName to text 2 thru length of item 1 of theseItems
        set itemValue to item 2 of theseItems
        set myMessage to myMessage & "Property Label: " & itemPropName & tab & "Value: " & itemValue & linefeed
    end repeat
    set AppleScript's text item delimiters to TIDL
    display dialog myMessage
end try
end ListProperties
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...