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

Дата публикации:17.07.2012
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

Глава 10. Условные операторы

Иногда необходимо, чтобы сценарий выполнил некоторую серию действий, только если выполняется определенное условие. Наберите следующую строку [1] в Script Editor и нажмите Run.

73 = 30	[1]

Вот что вы увидите в поле результата: false.

AppleScript вычисляет сравнение в сценарии [1] и заключает, что это false (ложь), т.е. не правда. Если вы введёте что-то подобное "30 = 30", вы увидите результат "true".

Эта способность AppleScript сравнивать два значения используется в операторе "if...then" (если... то) [2] для того, чтобы выполнить операторы только в том случае, если условие соблюдается. Оператор "if...then" называется условным оператором. Обратите внимание, что этот оператор требует наличия оператора "end if" (окончание если) в конце. Но об этом позже.

if true then
-- действия выполняется
end if [2]
if false then
-- эти действия не выполнятся
end if

Итак, все что нам нужно сделать, это заменить слово "true" в операторе [2.1] сравнением. Если это сравнение окажется верным ("true"), то операторы в строке [2.2] будут выполнены.

set ageEntered to 73
set myAge to 30
if ageEntered is myAge then	[3]
display dialog "You are as old as I am."
end if

Если сравнение ageEntered is myAge [3.3] было бы истинным, то было бы показано диалоговое окно. С указанными выше значениями переменных в первых двух операторах, вы не увидите этого окна [3.4].

Если нужно определить больше инструкций, которые должны будут выполниться при верном условии, они все их надлежит расположить внутри блока оператора "if...then...end if" [4].

set ageEntered to 73
set myAge to 30
if ageEntered is myAge then
display dialog "You are as old as I am."	[4]
beep
end if
say "This sentence is spoken anyway."

Вы заметили сходство между блоком обращения и оператором "if...then"? В обоих случаях необходимо, чтобы оператор содержал слово "end". "end if" позволяет AppleScript определить какие операторы будут выполняться если сравнение вернет "true". В сценарии [4], вы услышите последний оператор [4.7] независимо от того будет условие [4.3] выполняться или нет.

Мы можем также предложить альтернативный набор инструкций в том случае, если условие не выполниться, используя оператор "if...then...else" [5]

set ageEntered to 73
set myAge to 30
if ageEntered = myAge then
display dialog "You are as old as I am."	[5]
else
display dialog "You are not as old as I am." -- [5.6]
end if

Здесь, диалог оператора [5.6] будет отображен, потому что сравнение в операторе [5.3] выдаст "false" (ложь). Вы можете выполнять очень много разных сравнений. Эти операторы сравнения подходят и для других типов данных.

Кроме знака равно в операторе [5.3], в вашем распоряжении следующие операторы сравнения для чисел.

=is, is equal toесть, равно
>is greater thenбольше чем
<is less thenменьше чем
>=is greater then or equal toбольше или равно
lt;=!is less then or equal to!меньше или равно

Вторая колонка не просто показывает расшифровку символов первой колонки, вы также можете записывать сравнения в их устной форме! [6]

if a is greater than b then
display dialog "a is larger"	[6]
end if

Если набрать >= и выполнить проверку синтаксиса, AppleScript автоматически конвертирует этот оператор сравнения в служебный символ ≥. Аналогично, оператор сравнения "меньше или равно" <= будет заменен на ≤. Вы должны набирать символы в правильном порядке, иначе AppleScript будет выражать недовольство. Так что, он не всегда настолько дружественен к пользователю, как мог бы быть. (Чтобы ввести с клавиатуры символы ≤ и ≥, удерживайте option и нажмите знак меньше или больше соответственно. - прим. пер.)

Отрицательные формулировки также допустимы, например: "is not equal than" (не равно). Если набрать /=, оно автоматически будет переформатировано при компиляции в ≠, который для краткости читается как "is not" (Чтобы ввести с клавиатуры символ ≠, удерживайте option и нажмите знак равно. - прим. пер.)

В главе 7 мы столкнулись со следующим сценарием [7], который позволил нам определить, какая кнопка была нажата.

set stringToBeDisplayed to "Julia is a pretty actress."
set tempVar to display dialog stringToBeDisplayed buttons {"So, so", "Yes"}      [7]
set theButtonPressed to button returned of tempVar

Используя оператор "if...then", мы можем выполнить желаемые действия [8].

set stringToBeDisplayed to "Julia is a pretty actress."
set tempVar to display dialog stringToBeDisplayed buttons {"So, so", "Yes"}
set theButtonPressed to button returned of tempVar
if theButtonPressed is "Yes" then	[8]
say "I agree entirely!"
else
say "Didn't you see the movie 'Pretty Woman'?"
end if
beep

Если пользователь нажимает кнопку "Yes", тогда фраза оператора [8.5] проговаривается. В любом случае, сценарий продолжится и мы услышим сигнал beep последнего оператора.

В предыдущем сценарии, значения строк должны быть идентичны. Однако, AppleScript в состоянии сделать намного больше, чем это. Здесь три примера [9]. Обратите внимание, что "end if" не требуются, если выполняемая инструкция находится на той же строке, что и оператор "if...then".

set textString to "Julia is a beautiful actress."
if textString begins with "Julia" then display dialog "The first word is Julia"    [9]
if textString does not start with "Julia" then beep
if textString contains "beau" then set myVar to 5

Ниже дан обзор операторов сравнения для строк.

begins with (или starts with) начинается с
ends with оканчивается на
is equal to равно
comes before идет перед
comes after идет после
is in находится внутри
contains содержит

Можно также сформулировать их как негативные.

does not start with не начинается с
does not contain не содержит
is not in не находится внутри

и т.д.

Если написать "doesn't", то оно автоматически переформатируется на "does not".

Если написать "does not begin with", то выражение автоматически переформатируется на "does not start with".

Операторы сравнения "comes before" и "comes after" работают с алфавитным порядком. Так что, результатом следующего оператора будет сигнал beep [10].

if "Steve" comes after "Jobs" then
beep 		[10]
end if

Когда сравниваются строки,то регистр может быть важным для вас. Просто дайте знать об этом AppleScript'у.И конечно, когда закончите сравнение, не забудьте это указание выключить [11].

set string1 to "j"
set string2 to "Steve Jobs"
considering case
if string1 is in string2 then
display dialog "String2 contains a \"j\""	[11]
else
display dialog "String2 does not contain a \"j\""
end if
end considering

По умолчанию пробельное пространство (пробел, переход на другую строку/return, табуляция) учитывается. Если вы этого не хотите, наберите "ignoring white space" (игнорировать пробельное пространство), как продемонстрировано в сценарии [12]. Обратите внимание, что вы должны добавить оператор "end ignoring" или "end considering".

set string1 to "Stev e Jobs"
set string2 to "Steve Jobs"
ignoring white space	[12]
if string1 = string2 then beep
end ignoring

Вы можете также заставить AppleScript игнорировать пунктуацию или диакритические знаки.

Для типа данных list, доступно меньше операторов сравнения, чем для строк, но с другой стороны, они такие же. Так что, вам не придется заучивать больше операторов сравнения, чем необходимо.

begins with начинается с
ends with оканчивается на
contains содержит
is equal to равно
is in находится внутри

Часто бывает, что сравниваются индивидуальные элементы списка (или разных списков). Давайте взглянем на практический пример. Посмотрите на сценарий [8]. Что если у нас три кнопки в нашем диалоге? С помощью операторов вложенных в "if...then" [13], все опции диалога будут учтены.

set stringToBeDisplayed to "Julia is a pretty actress."
set tempVar to display dialog stringToBeDisplayed buttons {"So, so", "Who?", "Yes"}
set theButtonPressed to button returned of tempVar
if theButtonPressed is "Yes" then
say "I agree entirely!"
beep	[13]
else
if theButtonPressed is "Who?" then
say "Didn't you see the movie 'Pretty Woman'?" -- [4.8]
else
say "I don't agree with you."
end if
end if

Отступы облегчают чтение сценария, но это, тем не менее, немножко неудобно для чтения. Плюс к этому, когда много текста легко можно забыть или поставить не туда оператор "end if", в результате чего ваш сценарий не скомпилируется. Контекстное меню редактора Script Editor спасает! Вспомнили элементы меню Dialog со словом Actions?

Щелкните одну с 3-я кнопками (3 Btns) и 3-я действиями (Actions) и вам будет представлен полный набор необходимых операторов. Вам просто нужно заполнить значениями список [14.1] и впечатать необходимые действия.

display dialog "" buttons {"", "", ""} default button 3
set the button_pressed to the button returned of the result
if the button_pressed is "" then
-- здесь идут действия для первой кнопки
else if the button_pressed is "" then	[14]
-- здесь идут действия для второй кнопки
else
-- здесь идут действия для третьей кнопки
end if

Первые две строки, возможно, нуждаются в объяснении. Как видите, оператор [14.1] отличается от оператора [8.2], в котором мы не присваиваем какой-либо переменной результирующую запись команды display dialog. Просто, подобно полю результата, автоматически показывающего результат последнего выполненного оператора, результат предыдущего оператора будет доступен вам, если вы сошлетесь на него используя ключевое слово "result". При расположении оператора if на той же строке что и "else" [14.5], разделитель "end if" не требуется. В итоге, этот сценарий легче читается.

Для записей количество операторов сравнения еще более ограничено, чем для списков.

contains содержит
is equal to (или =) равно
set x to {name:"Julia", occupation:"actress"}
if x contains {name:"Julia"} then display dialog "Yes"	[15]

Обратите внимание, что в операторе [15.1] одна метка показана синим цветом, а другая зеленым. Таким образом вы предупреждены, что одна метка является ключевым словом. Несмотря на то, что AppleScript не запрещает вам использовать метки свойств идентичных зарезервированным ключевым словам, таких как "to", "set", "string" и т.д., это может позже привести вас к проблемам, так что остерегайтесь использования зарезервированных ключевых слов, и помните подсказки в главе 4 об именах переменных.

Ограниченное количество операторов сравнения для записей не проблема, потому что вы будете сравнивать не полные записи, а только индивидуальные значения свойств этих записей [16].

set aRecord to {name:"Julia", occupation:"actress"}
if name of aRecord is "Julia" then display dialog "OK"	[16]

Как мы видели в первой части этой главы, если сравнивать два значения (каков бы ни был их тип данных), вы на самом деле пытаетесь увидеть будет ли выражение сравнения истиной или ложью (true или false). И действительно, они представлены специальным типом данных, называемом - Boolean (булевой, логический тип). Переменные хранящие значение этого типа могут иметь только первое или второе значение: true или false. Для чисел, у вас есть операторы "+" и "-". Если вы используете такой оператор, результат будет числом. Для булевых операторов, мы имеем "and", "or" и "not". Результат этих операций опять же будет Boolean.

Простейшее из тех трех - "not". Например, "not true" будет ложь, и "not false" будет истина.

set x to not true --  Значит, переменной x  присвоить ложь	[17]

Как продемонстрировано в следующем сценарии [18], для оператора "and", оба x и y должны быть истиной, чтобы z было равно true.

set x to true
set y to true	[18]
set z to (x and y) -- z  равно true

И наоборот, для оператора "or", будет достаточно, чтобы хоть одно из x и y было true [19].

set x to true
set y to false	[19]
set z to (x or y) -- z равно true

Зачем я все это говорю вам? Ну, при некоторых обстоятельствах вам понадобиться выполнить набор инструкций только если несколько условий выполнится. Следующий сценарий [20] вызывает диалог только последнего оператора.

set x to 5
set y to 7
set z to "Julia"
if x = 5 and y = 6 then display dialog "Both conditions met."	[20]
if x = 5 or z = "actress" then display dialog "At least one condition met."

В операторе [20.4] первое сравнение истинно, а второе - нет. Для "and" требуется, чтобы бы оба операнда были истинными, так что диалоговое окно не появляется.

В операторе [20.5] "or" будет счастлив, если хоть одно из условий выполниться.

В сценариях, в операторах, подобных [20.4, 20.5], вам, скорее всего, захочется использовать скобки, так как это улучшает читаемость (и, возможно, надежность).

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

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


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