Swift: выражения, переменные и константы. Часть 1

image

Добро пожаловать в мини-серию о начале программирования на языке Swift! В в этой серии вы узнаете основы программирования на Swift. Данный материал является переводом tutorial с сайта raywenderlich.com.

В этой серии вы познакомитесь с основами программирования в современной, дружественной среде на языке программирования Swift.

Вместо того, чтобы утомлять теорией, сразу же перейдем к кодированию с помощью Swift, используя Swift Playground - специальную среду разработки для тестирования отдельных фрагментов кода, в которой вы можете выполнять код напрямую без необходимости создавать полноценное приложение.

Для этого урока вам понадобится Xcode 10, стандартная среда разработки для macOS доступна здесь. Если у вас Xcode версии 9 или ниже, некоторые фрагменты кода в этом руководстве не будет работать так, как ожидается.

С чего начать

Набор инструментов, которые используются для написания программного обеспечения, часто называют цепь инструментов. Часть цепочки инструментов, в которую вы пишете код, известна как интегрированная среда разработки (IDE). Xcode-это IDE, которая включает playground.

Вы будете использовать playgrounds во всей этой серии, чтобы практиковать кодирование, так что важно понимать, как playground работает. Вот что вы изучите в остальной части этого руководства.

Создание Playground

Когда вы откроете Xcode, первое, что вы увидете будет окно приветствия:

Welcome to Xcode

Если вы не видите этот экран, это скорее всего потому, что в чекбоксе, расположенном в нижнем левом углу окна при пердыдущем запуске Xcode был была снят флажок. Вы также можете открыть экран нажатие клавиши Command-Shift-1. Вы также можете нажать Window ▸ Welcome to Xcode в меню.

На экране приветствия вы можете быстро перейти в playground, нажав на Get started with a playground. После чего Xcode представит вам возможность выбора шаблона.

Template

Выбранная платформа определяет, какая версия шаблона Xcode будет использоваться для создания файла playground. В нашем примере можно выбрать: iOS, macOS или tvOS. Каждая платформа имеет свою собственную среду и готова для операций с кодом в playground. Для целей данного руководства, выберите шаблон Blank и нажмите Next.

Теперь Xcode попросит вас указать наименование файла playground и выбрать место для его сохранения. Название может быть любое поэтому, когда вы создаете свои файлы playground, не стесняйтесь выбирать правильные имена - это поможет вам в будущем вспомнить, какой код в том или ином файле playground.

Нажмите Create, чтобы создать и сохранить файл playground. Xcode создаст файл:

Create

Новые файлы playground не создаются полностью пустым, даже, если для их создания используется шаблон Blank, они имеют базовый код. Не волнуйтесь - вы скоро узнаете, что означает этот код.

Обзор Playground

На первый взгляд, может показаться, что playground выглядит как необычный текстовый редактор. Что ж, на самом деле это так и есть! Почти.

Overview

На скриншоте выше показаны первые и самые важные вещи, которые нужно знать работая в редакторе playground:

  1. Source editor (редактора исходного кода): это область, в которой вы будете писать код на Swift. Это похоже на текстовый редактор, такой как «Блокнот» или «TextEdit». Вы заметите, что он использует так называемый моноширинный шрифт, что означает, что все символы имеют одинаковую ширину. Это упрощает чтение и форматирование кода.

   2. Results sidebar (боковая панель результатов): Эта область показывает результаты при выполнении кода. Вы узнаете больше о том, как выполняется код, когда более детально ознакомитесь с данным руководством. Боковая панель результатов - это основное место, которое вы будете искать, чтобы убедиться в том, что ваш код работает так, как ожидалось.    3. Execution control: код в playground выполняется автоматически по умолчанию, что означает, что вы можете писать код и сразу видеть результат. В то же время этот элемент управления позволяет выполнять код тогда, когда это нужно. Удерживание кнопки ▶ ︎ (Execute) позволяет переключаться между режимами автоматического выполнения и ручным режимом.    4. Activity viewer: показывает статус playground. На скриншоте выше показано, что playground закончил выполнение кода. Когда playground находится в процессе исполнения кода Activity viewer демонстрирует крутящийся спинер..    5. Panel controls: эти переключатели показывают и скрывают три панели, одна из которых отображается слева, одна внизу и одна справа. Каждая из панелей отображает дополнительную информацию, которая вам может потребоваться время от времени. Обычно они скрыты, так как они представлены на скриншоте. Вы узнаете больше о каждой из этих панелей при изучении данного руководства.

Playground выполняет код в редакторе исходного кода сверху вниз. Каждый раз, когда вы изменяете код, playground будет заново выполнять код. Можно также запускать повторное выполнение, нажав Editor ▸ Run Playground в меню. Кроме того, вы можете использовать элемент управления выполнением.

Вы можете включить номера строк в левой части редактора исходного кода, нажав Xcode ▸ Preferences… ▸ Text Editing ▸ Line Numbers в меню. Номера строк могут быть очень полезны, когда вы хотите обратиться к фрагментам вашего кода.

Когда playground завершит выполнение кода, Xcode обновит боковую панель результатов чтобы показать результаты соответствующих строк в редакторе исходного кода.

Комментарии в коде, арифметические операции, константы и переменные являются фундаментом любого языка, и Swift в этом смысле ничем не отличается.

Коментарии в коде

Компилятор Swift генерирует исполняемый код из редактора исходного кода. Для выполнения этого, он использует код. Иногда большой объем кода не позволит вам по прошествии определенного времени вспомнить, почему вы написали свой код определенным образом или даже какую проблему вы решаете с помощью того или иного фрагмента кода. Чтобы этого не случилось, целесообразно хорошо документировать свой код, чтобы другой человек, который знакомится с вашим кодом, сможет понять его.

Swift, как и большинство других языков программирования, позволяет документировать код через использование так называемых комментариев. Они позволяют писать любой текст непосредственно рядом с вашим кодом, который игнорируется компилятором.

Первый способ написать комментарий выглядит так:

// Это комментарий. Он не выполняется компилятором.

Это однострочный комментарий. Вы можете писать их так, чтобы получались целые абзацы:

// Это тоже комментарий.
// Из нескольких строк.

Однако есть лучший способ написать комментарии, которые состоят из нескольких строк. Вот так:

/* Это тоже комментарий.
   Из многих...
   многих...
   многих строк. */

Это многострочный комментарий. Начало обозначается символом / *, а конец - обозначается символом * /. Все просто!

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

Комманда print()

Также полезно увидеть результаты того, что делает ваш код. В Swift вы можете добиться этого с помощью команды print().

print выводит все, что вы хотите, в область отладки, которая иногда называемый консолью.

Например, рассмотрим следующий код:

print("Привет, читатель!")

Эта комманда выведет сообщение в область отладки:

Print

Вы можете скрыть или отобразить область отладки, используя кнопку-стрелку в нижнем левом углу окна ;выделено красным цветом на изображении выше). Вы также можете нажать View ▸ Debug Area ▸ Show Debug Area в меню, чтобы сделать то же самое.

Арифметические операции

Когда вы берете одну или несколько частей данных и превращаете их в другие данные, это называется операцией.

Самый простой способ понять операции - вспомнить об арифметике. Операция сложения принимает два числа и преобразует их в сумму двух этих чисел. Операция вычитания принимает два числа и преобразует их вразницу этих двух чисел.

Вы найдете простую арифметику во всех приложениях: от подсчета количества лайков, до расчета правильного размера и положения кнопки или окна, цифры действительно присутствуют везде!

В этом разделе вы узнаете о различных арифметических операциях, которые Свифт может предложить, рассматрите как они применяются к числам. Позже вы увидите операции для типов, отличных от чисел.

Простые операции

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

Рассмотрим четыре арифметические операции, которые вы изучили в начальной школе: сложение, вычитание, умножение и деление. Для этих простых операций, Swift использует следующие операторы:

  • Сложение: +
  • Вычитание: -
  • Умножение: *
  • Деление: /

Примеры использования операторов:

2 + 6

10 - 2

2 * 4

24 / 3

Каждая из этих строк есть не что иное, как вражение. Выражение имеет значение. В этих случаяхвсе четыре выражения имеют одно и то же значение - 8. Вы пишите код для выполнения указанных арифметических операций точно также, как вы могли бы написать выражения используя перо и бумагу.

Broken paper

В вашем playground вы можете видеть значения этих выражений в правой части окна редактора, называемой боковая панель результатов:

Expressions

Если хотите, то можно удалить пробелы между аргументами выражения:

2+6

Удаление пробелов между аргументами выражения должно осуществляться по принципу "все или ничего". Не получится что-то удалит, а что-то оставить. Пример ниже объясняет такой подход:

2+6   // OK
2 + 6 // OK
2 +6  // ERROR
2+ 6  // ERROR

Часто бывает проще читать выражения, если по обе стороны от них есть пробелы.

Десятичные числа

Для выполнения операций описанных ранее использовались целые числа, больше известные как integers. Однако как вы знаете не каждое число может быть целым.

Как пример рассмотрим следующее выражение:

22 / 7

Вы можете удивиться, узнав, что результат данногов ыражения будет равен 3. Если вы используете только integers (целые числа) в выражении, Swift вычислит результат как integers. В этом случае, результат округляется до следующего целого числа.

Можно прямо указать Swift'у что необходимо использовать десятичные числа изменив аргументы выражения:

22.0 / 7.0

В этот раз результат будет равен 3.142857142857143, как и ожидалось.

Оператор остатка от деления

Четыре операции, которые вы видели до сих пор легко понять, потому что вы делали их большую часть своей жизни. Swift также имеет более сложные операции. Сейчас вы с ними познакомитесь.

Первая из них - операция остатка, также называемая модулем. При делении знаменатель переходит в числитель целым числом, при этом остается остаток. Этот остаток - именно то, что операция остатка от деления возвращает. Например, 10 по модулю 3 равно 1, потому что 3 делит 10 три раза нацело, с остатком 1.

В Swift оператор остатка от деления обозначается символом % и используется следующим образом:

28 % 10

В этом случае результат операции будет равен 8, потому, что 10 делит 28 нацело два раза с остатком 8. Если вы захотите получить остаток отделения десятичных чисел, вы можете сделать это следующим образом:

(28.0).truncatingRemainder(dividingBy: 10.0)

Это выражение делит 28 на 10, а затем обрезает результат, отрезая любые дополнительные десятичные числа, и возвращает оставшуюся часть. Результат идентичен %, когда нет десятичных знаков.

Операции сдвига (битовые операции)

Операции сдвиг влево и сдвиг вправо принимают двоичную форму десятичного числа и сдвигают цифры влево или вправо соответственно. Затем они возвращают десятичную форму нового двоичного числа.

Например, десятичное число 14 в двоичном формате, представляющее собой 8 цифр, равно 00001110. Смещение влево на два числа (разряда) приводит к 00111000, что равно 56 в десятичной системе.

Вот иллюстрация того, что происходит во время этой операции сдвига:

shift_left

Цифры, которые входят, чтобы заполнить пустоту справа, становятся 0. цифры, которые выпадают слева, теряются.

Сдвиг вправо тоже самое, но цифры перемещаются вправо.

Операторы для этих двух операций следующие:

  • Shift left: <<
  • Shift right: >>

Это первые операторы, из тех, с которыми вы познакомились, которые состоят более чем из одного сомвола. На самом деле операторы могут содержать любое количество символов.

Вот пример, который использует оба этих оператора:

1 << 3

32 >> 2

Оба этих значения эквивалентны 8.

Одной из причин использования операции сдвигов является возведение в степень или извлечение квадратного корня, второй - простота. Обратите внимание, что сдвиг влево на одно число это то же самое, что возведение числа в степень 2 (получение квадрата числа), смещение влево на два - это то же самое, что возведение числа в 4-ую степень. Точно так же, смещение вправо на одно число - это то же самое, что извлечение квадратного корня из числа второй степени, смещение вправо на два числа то же самое как извлечени корня 4 степени из числа и т. д.

В старые времена в коде часто использовали этот трюк, потому что побитовый сдвиг гораздо менее затратно для процессора, чем комплексное умножение и деление арифметика. Поэтому код выполнялся быстрее, если он использовал сдвиг. Однако с тех самых дней, процессоры стали намного быстрее и компиляторы могут даже преобразовать умножение и деление в операции сдвига. Таким образом, вы можете никогда не встретить операции сдвига только если вы не станете настоящим системным программистом!

Порядок выполнения операций

Очень часто необходимо использовать несколько операторов для вычисления значения. Вот пример того, как это можно сделать в Swift:

((8000 / (5 * 10)) - 32) >> (29 % 5)

Обратите внимание на то, что в примере используются скобки, которые в Swift служат двум целям: сделать яснее и понятнее чтение кода, включая того, кто код пишет и для устранения неоднозначности. Например, рассмотрим следующий пример:

350 / 5 + 2

Результат будет 72 (350 разделено на 5, плюс 2) или 50 (350 разделено на 7)? Те из вас, кто хорошо учился в школе, скажет «72!» И это будет правильно!

Свифт использует те же правила и так называемый приоритет оператора. Оператор деления (/) имеет более высокий приоритет, чем оператор сложения (+), поэтому в этом примере код выполняет сначала деление.

Если вы хотите, чтобы Swift сначала выполнил сложение - то есть, вернуть 50 - тогда вы можете использовать круглые скобки:

350 / (5 + 2)

Правила приоритета сответствуют тем же, что вы учили в школе. Умножение и деление имеют одинаковый приоритет, выше, чем сложение и вычитание, которые также имеют равный приоритет.

Матматические функции

В Swift также есть широкий спектр математических функций, которые вы можете использовать, когда это необходимо. Вы никогда не знаете, когда вам нужно использовать тригонометрию, особенно когда вы профессионал-swifter и пишете сложные игры!

Примечание. Не все эти функции являются частью Swift. Некоторые из них предоставляются операционной системой (ОС). Не удаляйте оператор import, который является частью шаблона playground или Xcode подскажут вам, что они не могут найти эти функции.

Например, рассмотрим следующее:

sin(45 * Double.pi / 180)
// 0.7071067811865475

cos(135 * Double.pi / 180)
// -0.7071067811865475

В этом примере вычиляются синус и косинус, соответственно. Заметьте, что оба выражения используют Double.pi - константу предоставляемую вам Swift, возвращающую значение числа Пи, вычисленное с максимально возможной точностью.

Следующий пример:

(2.0).squareRoot() // Same as sqrt(2)
// 1.414213562373095

В этом примере вычиляется квадратный корень из 2.

Другая общая операция - найти максимальное из двух переменных. Вы можете использовать ее вот так:

max(5, 10)
// 10

min(-5, -10)
// -10

Они вычисляют максимум и минимум двух чисел соответственно.

Если вы особенно предприимчивы, вы можете даже объединить эти функции, например так:

max(sqrt(2), Double.pi / 2)
// 1.570796326794897

Именование данных

В самом примитивном процессе компьютерного программирования всегда происходит манипуляция данными. Помните, что все, что вы видите на экране, можно свести к номерам, которые вы отправьте в ЦП (центральный процессор). Иногда вы сами создаете и работаете с этими данными как например, с различными типами чисел. В других случаях данные поступают в более сложных формах таких как текст, изображения и коллекции.

Используя язык Swift вы можете назначить каждой части данных имя, котороебудет импользоваться для обращения к нему по мере необходимости. Имя несет в себе ассоциированный тип, который обозначает какие данные относятся к имени, например текст, цифры или дата.

Далее вы узнаете о некоторых основных типах, и познакомитесь с другими типами.

Константы

Посмотрите на это:

let number: Int = 10

Это объявление константы названой number, которая имеет тип Int. Затем этой константе задается значение равное 10.

Заметка: Вспомните об операторах, здесь есть еще один: знак эквивалентности =, также известен как оператор присвоения.

Тип Int может хранить целые числа. Способ хранения десятичных чисел выглдит также:

let pi: Double = 3.14159

Это похоже на Int константу, за исключением имени типа. В этот раз константа имет тип Double, который может хранить десятичные числа высокой точности.

Есть также тип называемый Float, которые хранятдесятичные числа с точностью ниже, чем Double. Фактически Double это тип, который имеет точность в два раза большуу, чем Float, собственно поэтому Double так называется. Floatзанимает меньше памяти, чем Double, но в основном память используемая для чисел не занимает много места, поэтому чаще в программировании используется тип Double.

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

let number: Int = 10
number = 0

Этот код вызовет ошибку:

`Cannot assign to value: 'number' is a 'let' constant`

В Xcode вы можете увидеть ошибку In Xcode, you would see the error изображенную на следующем скриншоте:

Error

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

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

Переменные

Часто необходимо изменить данные присвоенныекакому-либо имени. Например, если у вас сохраняется баланс вышего банковского счета вы предпочтете использовать переменную чем константу.

Если данные программы не меняются, то это была бы довольно скучная программа! Но, как вы видели, невозможно изменить данные констант.

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

var variableNumber: Int = 42

Только первая часть выражения отличается: для объявления константы используется let, в то время как для объявления переменной используется var

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

variableNumber = 0
variableNumber = 1_000_000

Для изменения переменой вы просто назначаете ей новое значение.

Заметка: В Swift, вы можете дополнительно использовать знак нижнего дефиса (underscores) чтобы сделать длинные числа более удобными для чтения. Количество и расположение подчеркиваний зависит от вашего желания.

Это хорошее время познакомится поближе с боковой панелью результатов в playground. Когда вы набираете на клавиатуре код в playground, вы увидитечто результат в боковой панеле результатов справа показывает текущее значение variableNumber в каждой строке

Variables

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

Использование толковых имен

Всегда пытайтесь выбирать имена для ваших переменных или констант имеющих хоть какой-то смыл, значение. Хорошее название, как хороший комментарий, может сделать ваш код легким для чтения.

Хорошее имя точно описывает что из себя представляет константа или переменная. Вот нескольк примеров хороших имен:

  • personAge
  • numberOfPeople
  • gradePointAverage

Часто плохое имя это просто имя недостаточно описательное. Вот несколько примеров плохих имен:

  • a
  • temp
  • average

Имя должно гарантировать, что вы поймете, к чему относятся переменная или константа, когда вы будете обращатся к ним позже. Не делайте ошибку, думая, что вы имеете феноменальную память! В компьютерном программировании принято оглядываться назад и очень часто даже свой код можно забыть уже через день-два и забыть, что он делает. Сделайте проще для себя, присвоив переменным и константам интуитивно понятные точные названия.

Кроме того, обратите внимание, как написаны имена выше. В Swift, принят так называемы кэмел стиль написания имен. Для переменных и констант должны соблюдаться следующие правила написания имен:

  • начало имени с прописной буквы.
  • если имя состоит из нескольких слов, соедините х вместе, при этом начало каждого последующего слова, за исключением первого должно начинаться с заглавной буквы.
  • Если одно из этих слов является аббревиатурой, напишите всю аббревиатуру в целиком так, как она пишется(например, sourceURL и urlDescription).

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

var 🐶💩: Int = -1

Это может показаться прикольным, но будьте осторожны с такими специальными символами. Они относятся к сложному типу и, следовательно, могут в конечном итоге причинить вам больше боли, чем развлечения.

Bad choice

Специальные символы, подобные этим, вероятно, имеют больше смысла в данных, которые вы храните, а не в Swift-коде.

Инкремент и декремент

Обычная операция, которая вам понадобится, чтобы иметь возможность увеличивать или уменьшать переменные. В Swift это достигается следующим образом:

var counter: Int = 0

counter += 1
// counter = 1

counter -= 1
// counter = 0

Переменная counter начинается с 0. Инкремент устанавливает свое значение в 1, и затем декремент устанавливает свое значение обратно в 0.

Эти операторы аналогичны оператору присваивания ( = ), за исключением того, что онитакже выполняют сложение или вычитание. Они принимают текущее значение переменной, добавляют или вычитают данное значение и присваивают результат перемпенной.

Другими словами, приведенный выше код является сокращением для следующего:

var counter: Int = 0

counter = counter + 1
// counter = 1

counter = counter - 1
// counter = 0

Похожим образом работают операторы *= (умножения) и /= (деления), соответственно.

var counter: Int = 10

counter *= 3 // Same as counter = counter * 3
// counter = 30

counter /= 2 // Same as counter = counter / 2
// counter = 15

Что дальше?

Вы можете загрузить финальный файл playground. Там же вы найдете мини-упражнения для выполнения. Если вы застряли или вам нужна помощь, не стесняйтесь воспользоваться сопутствующими решениями.

В этом уроке вы имели дело только с числами - целыми числами и десятичное число. Конечно, dреальном мире есть гораздо больше, чем только числа! В следующем уроке в рамках этой серии вы узнаете о других типах, таких как строки, которые позволяют хранить текст.