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

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

Комментарии

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

Иногда эти подробности могут скрыть причину, почему вы написали код определенным образом или проблему, которую вы пытаетесь решить.

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

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

Комментарии пишутся следующим образом:

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

Это однострочный комментарий. Вы можете писать их в виде параграфов.

// Это тоже комментарий.
// Занимающий несколько строк.

Тем не менее, есть лучший способ писать комментарий на несколько строк. Например, следующим способом:

/* Это тоже комментарий.
Занимающий много...
много...
много строк. */

Это многострочный комментарий. Он начинается со слеша и звездочки (/*) и заканчиваются звездочкой, за которой следует слеш (*/). Все просто!

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

Вывод на экран

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

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

print("Hello, Swift Apprentice reader!")

Эта команда выведет сообщение в область откладки следующим образом:
screen_shot_2017-06-13_at_2.44.12_pm.png
Вы можете скрыть или показать область откладки с помощью кнопки (на картинке подсвечивается красной рамкой). Для аналогичного результата, вы можете использовать кнопку View\Debug Area\Show Debug Area.

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

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

Вы найдете простые арифметические действия во всех своих приложениях (от подсчета числа “лайков” до вычисления правильного размера и положения кнопки или окна приложения). Числа присутствуют действительно везде!

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

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

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

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

  • Add: +
  • Subtract: -
  • Multiply: *
  • Divide: /

Эти операторы используются следующим образом:

2 + 6
10 - 2
2 * 4
24 / 3

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

screen_shot_2017-06-13_at_2.49.38_pm.png

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

screen_shot_2017-06-13_at_2.51.14_pm.png

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

2+6

Пробелы нужно убрать все или оставить их. Нельзя смешивать стили. Например,

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

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

Целые числа

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

22 / 7

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

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

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

22.0 / 7.0

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

Деление с остатком

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

Первой из них является операция remainder (деление с остатком), также известной как (деление по модулю). При делении, знаменатель переходит в числитель целое количество раз, плюс остаток. Этот остаток именно то, что дает операция деления с остатком. Например, 10 по модулю 3 равен 1, потому как 3 переходит в 10 три раза, с остатком 1.

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

28 % 10

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

Операции левого и правого сдвига

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

Например, десятичное число 14 в бинарной системе это 00001110.
При сдвиге влево на две позиции, получается значение 00111000, что в десятичной системе равно 56.

Ниже приведена иллюстрация операции сдвига.

screen_shot_2017-06-14_at_11.54.33_am.png

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

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

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

  • Сдвиг влево: <<
  • Сдвиг вправо: >>

Как вы заметили, это первые операторы, содержащие более одного символа.

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

Вот пример, где используется оба этих оператора:

1 << 3
32 >> 2

Оба значения равны числу 8.

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

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

Приоритет операций

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

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

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

350 / 5 + 2

Равно ли это 72 (350 разделить на 5, плюс 2) или 50 (350 разделить на 7)? Тот кто был внимателен на уроках в школе будет кричать 72. И вы будете правы! Swift использует туже логику и реализует ее с помощью так называемых приоритет операторов. Оператор деления (/) имеет больше приоритет чем оператор сложения (+), так что в этом примере код выполняет операцию деления первой.

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

350 / (5 + 2)

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

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

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

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

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

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

Эти функции вычисляют соответственно синус и косинус. Обратите внимание, как обе функции используют константу Double.pi, которая образуется с помощью значения pi, передаваемой операционной системой.

Или еще пример:

sqrt(2.0)
// 1.414213562373095

Эта функция вычисляет квадратный корень из 2. Вы знали, что синус (45°) равен 1 над квадратным корнем из 2?

Примечание: Обратите внимание, как вы использовали 2.0 вместо 2 в приведенном выше примере? Функции, предоставляемые операционными системами (такие как sqrt, sin и cos) достаточно придирчивы и принимают только цифры, который содержат десятичную точку.

Или вот пример, который нельзя не упомянуть:

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

Эти функции вычисляют соответственно максимальное и минимальное число из двух указанных.

Вы даже можете объединить эти две функции следующим образом:

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

Присваивание имени для данных

Если говорить простым языком, компьютерное программирование — это манипулирование данными. Запомните, все, что вы видите на экране может быть сведено к числам, которые вы пересылаете в центральный процессор. Иногда вы работаете с этими данными как с различными типами чисел, но временами данные представлены в более сложной форме, такой как текст, изображения, или коллекции.

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

В этой главе вы узнаете о базовых типах. И также вы столкнётесь с множеством других типов в остальных частях этой книги.

Константы

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

let number: Int = 10

Здесь объявляется константа с именем number, которая имеет тип int. Затем, устанавливается значение константы – число 10.

Примечание: Оглядываясь назад на операторы, вот вам еще один. Знак равенства, =, известный как оператор присваивания.

Тип Int может хранить целые числа. Чтобы хранить десятичные числа, пишите следующим образом:

let pi: Double = 3.14159

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

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

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

let number: Int = 10
number = 0

Этот код возвращает ошибку:

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

В XCode, ошибка представлена следующим образом:

screen_shot_2017-06-14_at_12.09.44_pm.png

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

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

Переменные

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

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

Если вы знаете, что вам будет необходимо изменять некоторые данные, вам следует использовать переменные вместо константы. Переменная объявляется следующим образом:

var variableNumber: Int = 42

Обратите внимание, что видоизменилась первая часть утверждения. Константа объявляется с помощью let, а переменная с помощью var.

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

var variableNumber: Int = 42
variableNumber = 0
variableNumber = 1_000_000

Чтобы поменять переменную, вы просто присваиваете новое значение.

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

Сейчас давайте внимательно посмотрим на панель результатов в вашем playground'е. При вводе кода, вы увидите, что панель результатов справа отображает текущее значение для variableNumber в каждой строке:

screen_shot_2017-06-14_at_12.12.16_pm.png

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

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

Всегда старайтесь использовать понятные имена для ваших констант и переменных. Хорошие имена могут заменить документацию и сделать ваш код легко читаемым.

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

  • personage
  • numberOfPeople
  • gradePointAverage

Зачастую, плохое имя недостаточно описывает код. Вот примеры плохих имен:

  • a
  • temp
  • average

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

Обратите внимание как написаны имена ниже. В языке Swift, нормальная практика использовать ГорбатыйРегистр при написании имен. Используйте следующие правила, при составлении имен для переменных и констант:

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

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

screen_shot_2017-06-14_at_12.14.19_pm.png

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

screen_shot_2017-06-14_at_12.15.05_pm.png

Использование специальных символов имеет больше смысла в хранимых данных, чем в коде Swift. Больше про Юникод, вы узнаете из главы 4: “Строки”.

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

Одна из распространённых операций, которую вы будете использовать - это увеличение и уменьшение переменной. В языке 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 = counter – 1

Аналогично, операторы *= и /= выполняют умножение и деление.

var counter: Int = 10
counter *= 3 // same as counter = counter * 3
// counter = 30
counter /= 2 // same as counter = counter / 2
// counter = 15

Мини-упражнения

Если вы до сих пор не практиковали данные примеры, пришло время для создания тестовой площадки и попробовать некоторые упражнения чтобы проверить себя!

  1. Объявите константу с типом Int и именем myAge и укажите значение равно вашему возрасту!
  2. Объявите переменную с типом Double и именем averageAge. Сначала укажите ваш возраст, а потом установите среднее значение между вашим возрастом и моим возрастом (30).
  3. Создайте константу с именем testNumber и инициализируйте ее с любым целым числом. Потом, создайте еще одну константу с именем evenOdd и установите значение, которое равно значению testNumber по модулю Теперь измените значение testNumber на разные числа. Как поменялась константа evenOdd?
  4. Создайте переменную с именем answer и инициализируйте ее со значением 0. Инкрементируйте значение на 1. Прибавьте 10. Умножьте на 10. Теперь, выполните операцию правого сдвига на 3. Каков ваш результат?

Ключевые моменты

  • Комментарии к коду указываются в строчке, начинающейся с // или в нескольких строчках, используя символы /* и */.
  • Комментарии к коду используются чтобы документировать ваш код.
  • Используйте print, чтобы писать в области откладки.
  • Арифметические операторы бывают следующими:
Add: +
Subtract: -
Multiply: *
Divide: /
Remainder: %

  • Константы и переменные присваивают имена для данных.
  • После того, как вы объявили константу, вы не можете менять данные, но вы можете поменять данные для переменной в любое время.
  • Всегда присваивайте понятные имена для констант и переменных, чтобы избавить себя или ваших коллег от головной боли.
  • Операторы, которые выполняют арифметические операции и потом присваивают значение обратно для переменной:
Add and assign: +=
Subtract and assign: -=
Multiply and assign: *=
Divide and assign: /=

Что дальше?

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

Задачи

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

  1. Объявите константу exercises со значением 11 и переменную exercisesSolved со значением 0. Инкрементируйте эту переменную каждый раз, когда вы успешно решаете задачу. (включая эту).
  2. Учитывая следующий код:
age = 16
print(age)
age = 30
print(age)

Объявите возраст, чтобы он компилировался. Вы использовали var или let?

3. Учитывая следующий код:

let a: Int = 46
let b: Int = 10

Выясните чему равен answer при подмене последней строчке из кода выше на одну из следующих опций:

// 1
let answer1: Int = (a * 100) + b
// 2
let answer2: Int = (a * 100) + (b * 100)
// 3
let answer3: Int = (a * 100) + (b / 10)  

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

5 * 3 - 4 / 2 * 2 

5. Объявите две константы a и b с типом Double и присвойте обоим значения. Вычислите среднее значение a и b и сохраните результат в константе с именем average.

6. Температура, обозначенная в °C может быть конвертирована в °F путем умножения на 1.8., а затем увеличения на 32. В этой задаче, выполните обратное: сконвертируйте значение температуры с °F в °C. Объявите константу с именем Fahrenheit и типом Double и присвойте ей значение. Вычислите соответствующую температуру в °C и сохраните результат в константе с именем celcius.

7. Допустим клетки на шахматной доске пронумерованы с слева на право и сверху вниз со значением 0 в верхней левой клетке и значением 63 в правой нижней клетке. Строки пронумерованы сверху вниз от 0 до 7. Столбцы пронумерованы слева направо от 0 до 7. Объявите константу position и присвойте ей значение от 0 до 63. Вычислите соответствующие номера строки и столбца и сохраните результаты в константах с именами row и column.

8. Объявите константы с именами dividend и divisor c типом Double и присвойте обоим значение. Вычислите коэффициент и остаток деления dividend на divisor (в виде целого числа) и сохраните результаты в константах с именем quotient и remainder. Вычислите остаток без использования оператора %.

9. Круг состоит из двух 2п радиан, соответствующим 360 градусам. Объявите константу degrees c типом Double и присвойте ей значение. Вычислите соответствующий угол в радианах и сохраните результат в константе с именем radians.

10. Объявите четыре константы с именами x1, y1, x2 и y2 и типом Double. Эти константы представляют собой двумерные координаты двух точек Рассчитайте расстояние между этими двумя точками и сохраните результат в константе с именем distance.

11. Инкрементируйте переменную exercisesSolved в последний раз. Используйте функцию print чтобы вывести процент задач, которые вы сумели решить. Результатом должно быть число между 0 и 1.

Добавить комментарий