Перейти к содержимому
Теория · Переменные и типы · урок 1 из 7

Константы и переменные

Чему вы научитесь

Чему вы научитесь:

  • объявлять константы через let и переменные через var и выбирать между ними;
  • называть базовые типы Swift и задавать тип явно;
  • переводить значение из одного типа в другой через Int(…), Double(…) и String(…);
  • подставлять значения и выражения в строку через \( ).
Открытая коробка var, в которую кладут новую плитку, и запертая коробка let с плиткой 42 внутри

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

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

Зачем программе коробки? Она запоминает значения, чтобы прочитать их на следующих строках: имя игрока, счёт, число попыток. Имя игрока за всю игру не меняется, а счёт растёт. Вот как это записывают в Swift:

SWIFT
let player = "Anna"
var score = 0
print(player, score)  // Anna 0
score = 50
print(player, score)  // Anna 50

Давайте разберём программу по строкам:

  1. let player = "Anna" заводит запечатанную коробку player и кладёт в неё текст "Anna".
  2. var score = 0 заводит открытую коробку score с числом 0.
  3. print(player, score) заглядывает в обе коробки и печатает Anna 0.
  4. score = 50 открывает коробку score и кладёт в неё 50 вместо 0.
  5. Второй print печатает Anna 50: имя то же, а счёт уже другой.

Два слова объявления

Объявить константу или переменную — значит завести для неё коробку с именем. Константу и переменную объявляют одинаково, отличается только первое слово. Строка var score = 0 состоит из четырёх частей:

  • var — какую коробку завести;
  • score — имя на наклейке;
  • = — знак, после которого идёт значение;
  • 0 — начальное значение.

let — константа

Слово let по-английски значит «пусть»: строка let player = "Anna" читается как «пусть player будет "Anna"». Значение константы задают один раз, при объявлении. Читать её можно сколько угодно, а положить в неё что-то другое нельзя.

var — переменная

Слово var — начало английского слова, которое значит «переменная». Переменной можно задавать новые значения сколько угодно раз, пока работает программа.

Имена

Имена в Swift принято писать английскими словами. Первое слово начинается с маленькой буквы, а каждое следующее — с большой: score, maxScore, playerName.

Присваивание

Строка score = 50 — это присваивание: оно кладёт в переменную новое значение. Слова var в этой строке нет: коробка уже заведена, её только открывают.

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

SWIFT
score = score + 25
print(score)  // 75
  1. Swift читает из score старое значение 50.
  2. Прибавляет к нему 25 и получает 75.
  3. Кладёт 75 обратно в score, а 50 пропадает.

Здесь картинка с коробками неточна. Если вынуть вещь из настоящей коробки, коробка опустеет. А чтение значения — в print(score) или в score + 25 — ничего не вынимает: после него в коробке лежит то же самое.

Нажмите «Следующий шаг» и следите за двумя коробками: score меняется на каждом присваивании, а bonus до конца программы хранит 10.

ВживуюПеременная меняется, константа — нетшаг 1 из 9 · рамок: 1

Константа bonus запечатана с числом 10 до конца программы.

Следите за bonus: её значение не меняется ни на одном шаге

Сначала let

Swift-разработчики объявляют значения через let, а var пишут, только когда значение будет меняться. У этого правила две причины:

  • читатель кода сразу видит, что значение не изменится, и не ищет строку, где его переписывают;
  • компилятор следит за константой и находит случайное присваивание ей ещё до запуска программы.

Этот вопрос часто задают на собеседовании: «Чем let отличается от var?» Ответ состоит из двух частей:

  • let объявляет константу: значение задают один раз, и присвоить новое нельзя;
  • var объявляет переменную: присваивание = может положить в неё новое значение.

Частая ошибка

Значение объявили через let, а потом попытались изменить:

SWIFT
let limit = 3
limit = 5 // ✗
TEXT
error: cannot assign to value: 'limit' is a 'let' constant

Как вы уже знаете, компилятор проверяет весь файл до запуска, поэтому программа не напечатает ничего, даже строки выше ошибки. Рядом с ошибкой Swift сам подсказывает исправление: заменить let на var. Сделайте так, если значение должно меняться: var limit = 3.

Главное

  • let объявляет константу: значение задают один раз, и изменить его нельзя.
  • var объявляет переменную, и присваивание = кладёт в неё новое значение.
  • Присваивание сначала вычисляет правую часть, поэтому score = score + 25 опирается на старое значение.
  • Объявляйте через let, а var пишите, когда значение будет меняться.