Базовые типы
В прошлом уроке в коробки попадали числа и текст. Но коробки на полке разной формы, и форма решает, что в коробку можно положить.
Коробка для целых чисел не примет текст, а в коробку для текста нельзя положить число. Форму коробки в программе называют типом. По типу компилятор знает, что можно делать со значением: числа можно умножать, а слова — нет. Если перепутать, он скажет об этом ещё до запуска программы.
Начнём с пяти базовых типов, которые нужны почти в каждой программе. В этой программе есть каждый из них:
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:):
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 — целое число, но цены бывают и дробными, поэтому коробка нужна для дробных чисел. Тогда тип указывают сами: двоеточие и имя типа после имени константы. Такая запись называется аннотацией типа:
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.
Частая ошибка
В переменную с числом положили текст:
var year = 2024
year = "next" // ✗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.