appleScript для абсолютных новичков

Дата публикации:16.07.2012
Twitter Facebook Vkontakte

Глава 7. Записи

В предыдущей главе мы использовали команду "display dialog" для ознакомления с новым типом данных - списком. Теперь мы ее используем для изучения другого типа данных.

Команда "display dialog" позволяет вам задать число кнопок, предоставив список от одной до трех строк [1.2].

set stringToBeDisplayed to "Julia    is a pretty   actress."
display dialog stringToBeDisplayed buttons {"So,  so",  "Don't know",  "Yes"}	[1]

Но как узнать, какая кнопка была нажата? Посмотрите сценарий [2]

set stringToBeDisplayed to "Julia   is a pretty   actress."
set tempVar to display dialog stringToBeDisplayed buttons {"So, so", "Don't know", "Yes"}        [2]

Когда вы выполните сценарий [2], вы увидите результат в поле результата. В зависимости от того какую вы нажали кнопку, он будет выглядеть подобно этому: button returned:"Yeв"}

заключается в фигурные скобки, но в отличие от списка каждый элемент состоит из двух частей, разделенных двоеточием. Элемент записи называется свойством (property), а также часто называется как пара имя/значение. Первая часть свойства это метка (label) или имя (в нашем примере "button returned"), а вторая часть - само значение этого свойства (здесь значение - строка "Yes"). Так как вторая часть является значением, то редактор Script Editor показывает её черным.

Чтобы определить, какая из кнопок была нажата, все что мы должны сделать, это потребовать значение свойства имеющего метку "button returned" [3.3].

set stringToBeDisplayed to "Julia   is a pretty   actress."
set tempVar to display dialog stringToBeDisplayed buttons {"So, so", "Don't know", "Yes"}       [3]
set theButtonPressed to button returned of tempVar
display dialog "You pressed the following button " & theButtonPressed

В операторе [3.3] мы указываем, что хотим установить переменную "theButtonPressed", на значение содержащееся в свойстве с меткой "button returned" записи "tempVar". И мы это делаем! Теперь мы знаем какая кнопка диалогового окна была нажата.

Диалоговое окно ограничено тем, что показывает только числа и (короткие) строки. Оно не может показывать списки и записи. А вот поле результата показывает все типы данных, как мы и видели до сих пор. Не смотря на это, "display dialog" может сделать кое-что очень полезное: он позволяет пользователю ввести числа или текст, которые ваш сценарий может потом обработать.

Чтобы появилась строка ввода, вы должны задать ответ по умолчанию (default answer) как строку, например как пустую строку"" [4].

set temp to display dialog "Who is your favorite actress?" default answer ""	[4]

Если вы запустите сценарий [4], результатом будет запись из двух значений, т.е. две пары имя/значение, такая запись может выглядеть как эта в поле результата (в зависимости от того, что ввел пользователь): {text returned:nJulianr button returned:"ОК"}

Обратите внимание, подобно элементам списка, свойства разделены запятой. AppleScript не спутает запись со списком, потому что там есть двоеточия. В отличие от списка, где вам надо помнить какой порядковый номер элемента какую часть информации содержит, фактически данные могут быть извлечены из записи указанием метки свойства, что куда проще. Чтобы извлечь имя актрисы, все что мы должны сделать, это потребовать значение свойства имеющего метку "text returned" [5.2].

set temp to display dialog "Who is your favorite actress?" default answer ""	[5]
set textEntered to text returned of temp

Обратите внимание, что значение text returned будет строкой, и всегда будет строкой, даже если пользователь ввел число. Например, если пользователь ввел 30, значение переменной textEntered будет не 30, а "30". Если вы захотите выполнить вычисления с введенными данными, то вам повезло. AppleScript попытается преобразовать строку в число автоматически [6.3]. Так что, вам не обязательно включать опреатор преобразования [7.1] после оператора [6.2].

set temp to display dialog "What is your age?" default answer ""
set ageEntered to text returned of temp	[6]
set ageInMonths to ageEntered * 12
display dialog "Your age in months is" & ageInMonths
set ageEntered to ageEntered as number	[7]

Преобразование будет работать, если пользователь ввел число, такое как 30. Но если пользователь ввел "тридцать" или "30 лет", AppleScript не сможет выполнить преобразование, и в сценарии возникнет сбой. Так как нет надежды на то, что пользователь сделает именно все так, как было задумано вами, вам придется научиться писать сценарии, которые будут учитывать разные случаи поведения пользователя. В главе 10 вы узнаете как разрешить такую задачу.

Вы можете создать свою собственную запись, присвоив переменной пару имя/значение [8].

set personalData to {age:30}	[8]

Обратите внимание, что цвет свойства "age" зеленый, т.е. описанный, определенный вами. Как обычно, данные показаны черным.

Возвращаясь к сценариям [3, 5], обратите внимание, что метка свойства "button returned" и "text returned" являются зарезервированными словами AppleScript. Вы видите, их цвет синий, но их еще отличает и то, что они состоят из двух слов. Если вы создаете свои записи, вам не позволено использовать два или более слов для идентификации свойства [9.1]. Метка (или имя) свойства должна быть одним словом. [9.2]

set improperlyNamedProperty to {my property: "This is not correct"}	[9]
set properlyNamedProperty to {myproperty:"This   is   correct"}

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

Пожалуйста, не называйте свойства элементами (items) записи, потому что, хоть следующий сценарий [10] и проходит синтаксическую проверку, AppleScript не позволяет ссылаться на пары имя/значение в записи как на элемент [10.2].

set longRecord to {age:5, season:"winter"}
set cantGetARecordLikeThis to item 2 of longRecord	[10]

Тем не менее, вы можете подсчитать сколько свойств в записи [11]:

set longRecord to {age:5, season:"winter"}
set theNoOfProperties to the count of longRecord	[11]

Чтобы создать новую запись, содержащую свойство другой записи, вы должны создать запись так как показано ниже [12].

set longRecord to {age:5, season:"winter"}
set temp to the age of longRecord	[12]
set newRecord to {age:temp}

Поле результата покажет новую запись, которая будет {age:5}. Возможно написать сценарий [12] более кратко, но может быть вы поначалу найдете его более тяжело читаемым [13].

set longRecord to {age:5, season:"winter"}	[13]
set newRecord to {age:age of longRecord}

К несчастью, невозможно определить, какая пара имя/значение присутствует в записи. Вот почему вы не сможете создать список из меток всех свойств. Так же, невозможно изменить метки в записи. Если вы хотите использовать другую метку, вы должны создать запись заново, как показано в сценарии [13].

Давайте закончим эту главу одним неприятным подводным камнем. Вот сценарий, в котором нет каких-либо сюрпризов [14].

set firstValue to 30
set rememberFirstValue to firstValue -- копия сохраняется в "rememberFirstValue".	[14]
set firstValue to 73 -- изменяем значение исходной переменной.
get rememberFirstValue -- запрашиваем значение "rememberFirstValue".

Результат - 30. Для записей (и списков!) этот порядок действий совершенно другой, что в результате может привести к очень тяжелому отлову ошибок. Посмотрите на сценарий [15]

set personalData to {age:30}
set rememberPersonalData to personalData	[15]
set age of personalData to 73
get rememberPersonalData

Результат будет {age:73}! ! ! Команда set никогда не создаст копию, если переменная содержит запись или список. Чтобы быть уверенным в том, что данные скопировались, вы должны использовать команду copy [16].

set personalData to {age:30}
copy personalData to rememberPersonalData	[16]
set age of personalData to 73
get rememberPersonalData

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

Дополнительная информация

  1. Полный вариант книги (rtf/7z)-- электронная книга с сохранением иллюстраций, форматирования, изменений в цвете шрифта.


Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2019