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

Базовые типы

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

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

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

SWIFT
let age = 30
let height = 1.75
let isStudent = true
let name = "Anna"
let grade: Character = "A"
print(age, height, isStudent, name, grade)  // 30 1.75 true Anna A

Каждая строка объявляет константу своего типа, а print печатает все пять значений через пробел: 30 1.75 true Anna A. Давайте разберём типы по одному.

Пять базовых типов

Int — целые числа

Int хранит целые числа без дробной части: возраст, количество, номер в очереди. Например, 30, 0 или -7.

Double — дробные числа

Double хранит числа с дробной частью: рост, цену, температуру. В коде дробную часть всегда отделяют точкой, а не запятой: 1.75. Даже целое число в этом типе печатается с дробной частью: 5.0.

Bool — да или нет

Bool хранит одно из двух значений: true — «да, верно» или false — «нет, неверно». В таких константах хранят ответы на вопросы: учится ли человек, включён ли звук.

String — текст

String хранит текст в двойных кавычках, например "Anna". Кавычки отмечают начало и конец текста в коде, а print их не печатает.

Character — один символ

Character хранит ровно один символ: букву, цифру или знак. Его пишут в тех же двойных кавычках, что и текст, поэтому тип называют явно: let grade: Character = "A". Без : Character в grade оказалась бы строка из одной буквы.

Вывод типа

В первых четырёх строках примера тип нигде не написан, но он всё равно есть у каждой константы. Swift выбирает его сам по значению справа от =. Это называют выводом типа. Увидеть выбранный тип помогает type(of:):

SWIFT
print(type(of: 5), type(of: 5.0))     // Int Double
print(type(of: "5"), type(of: true))  // String Bool

Правило вывода короткое:

  • целое число 5 даёт Int;
  • число с точкой 5.0 даёт Double;
  • текст в кавычках "5" даёт String;
  • true и false дают Bool.

Этот вопрос часто задают на собеседовании: «Как Swift узнаёт тип, если его не написали?» Компилятор выводит тип по значению при объявлении, и дальше тип не меняется. Тип есть у каждого имени, хотя пишут его не всегда.

Аннотация типа

Иногда вывод даёт не тот тип, что нужен. Цена 5 — целое число, но цены бывают и дробными, поэтому коробка нужна для дробных чисел. Тогда тип указывают сами: двоеточие и имя типа после имени константы. Такая запись называется аннотацией типа:

SWIFT
let price: Double = 5
print(price)  // 5.0

Разберём строку let price: Double = 5 по частям:

  • let — объявляем константу;
  • price — её имя;
  • : Double — аннотация: коробка для дробных чисел;
  • = 5 — значение, которое Swift кладёт в коробку как 5.0.

Поэтому print(price) печатает 5.0, а не 5. Аннотацию пишут, когда вывод дал бы не тот тип: Double для целого числа или Character для одной буквы. В остальных случаях её обычно не пишут: в let age = 30 тип понятен и так.

Здесь картинка с коробками перестаёт работать. Настоящую коробку можно перекроить под другую вещь. А тип константы или переменной задают один раз, при объявлении, и до конца программы он не меняется — даже у var.

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

В переменную с числом положили текст:

SWIFT
var year = 2024
year = "next" // ✗
TEXT
error: cannot assign value of type 'String' to type 'Int'

var разрешает менять значение, но не тип. Swift вывел для year тип Int из числа 2024, и строка в эту коробку не помещается. Если нужно хранить текст, заведите для него отдельную переменную: var yearText = "next".

Главное

  • У каждого значения в Swift есть тип; базовые типы — Int, Double, Bool, String и Character.
  • Swift выводит тип из значения: 5 — это Int, 5.0 — Double, "5" — String.
  • Аннотация задаёт тип явно: let price: Double = 5 хранит 5.0.
  • Тип задают при объявлении, и потом он не меняется, даже у var.