Базовые типы и операции

Любая программа крутится вокруг нескольких фундаментальных типов: целых чисел, дробных, строк и логических значений.
Суть урока: Swift не делает неявных преобразований между типами. Хотите сложить Int и Double — преобразуйте явно. Это занудно, но спасает от тонких багов.

Познакомимся с базовым набором. Int — целые числа (10, -3, 0). Double — числа с плавающей точкой (3.14, -0.5). String — текст ("привет"). Bool — логическое значение (true или false). Эти четыре типа покрывают огромную долю повседневного кода.

let likes: Int = 42
let rating: Double = 4.8
let title: String = "SwiftUI"
let isPublished: Bool = true

let total = likes + 8        // 50, Int
let area = 3.0 * rating      // 14.4, Double

С арифметикой всё привычно: +, -, *, /, остаток %. Но есть подвох. Swift не разрешит сложить Int и Double напрямую — типы должны совпадать:

let count = 5         // Int
let price = 9.99      // Double
// let bad = count * price   // ОШИБКА
let good = Double(count) * price   // 49.95, явное преобразование

Чтобы сложить разные типы, мы оборачиваем одно значение в конструктор другого: Double(count). Это явное преобразование типов. Многие новички ругаются на эту строгость, но именно она не даёт случайно потерять дробную часть или получить переполнение.

Строки в Swift умеют многое: их можно склеивать оператором +, измерять (title.count), приводить к верхнему регистру (title.uppercased()) и собирать через интерполяцию \(...).

Попробуй сам ▶ — запусти код прямо в браузере (Pyodide). Здесь нет Swift, но логика та же, что под капотом мобильного кода:

# Та же арифметика и преобразования — но на Python.
# Здесь видно, ЗАЧЕМ Swift требует явности:
count = 5
price = 9.99

# В Python int*float работает молча — иногда это маскирует ошибки
print('total =', count * price)

# Имитируем строгость Swift: преобразуем вручную
total = float(count) * price
print('explicit =', round(total, 2))

# Строки
title = 'SwiftUI'
print(title.upper(), 'длина:', len(title))

Как работает под капотом

Числа в памяти хранятся по-разному: Int на 64-битном устройстве занимает 64 бита и хранит точное целое; Double следует стандарту IEEE 754 и хранит число в виде мантиссы и экспоненты, из-за чего возможны крошечные погрешности (например, 0.1 + 0.2 не равно ровно 0.3). Понимание этого спасает от загадочных багов в финансовых расчётах, где обычно используют специальные типы вроде Decimal.

Частые ошибки

  • Ожидать неявного преобразования. Int и Double не складываются автоматически.
  • Целочисленное деление. 7 / 2 для двух Int даёт 3, а не 3.5 — дробная часть отбрасывается.
  • Сравнивать Double на точное равенство. Из-за погрешностей лучше сравнивать с допуском.

Best practices

  • Для денег используйте Decimal, а не Double.
  • Преобразуйте типы явно и осознанно — это документирует намерение.
  • Используйте интерполяцию строк вместо длинной склейки через +.

Итоги. Int, Double, String и Bool — рабочие лошадки Swift. Язык требует явных преобразований между числовыми типами, и эта строгость — не каприз, а защита от тихих потерь данных.

Шире контекста

Строгая типизация Swift на первый взгляд кажется придиркой, но именно она отличает язык, на котором пишут банковские и медицинские приложения. Представьте расчёт скидки, где случайно сложили рубли как целое число и проценты как дробное — без явных преобразований такая ошибка тихо исказила бы сумму. Swift заставляет вас осознанно сказать «да, я хочу преобразовать одно в другое», и в этот момент вы перепроверяете логику. Со временем вы начнёте ценить и набор числовых типов: Int для счётчиков и индексов, Double для измерений и физики, Decimal для денег, где недопустима даже крошечная погрешность. Понимание, какой тип выбрать под задачу, — признак инженерной зрелости. А интерполяция строк, которую мы освоили, будет сопровождать вас повсюду: от отладочных print до текста на кнопках в SwiftUI.

Проверьте себя
1. Что произойдёт при попытке вычислить count * price, где count это Int, а price это Double?
ASwift автоматически преобразует Int в Double
BОшибка компиляции — нужно явное преобразование
CРезультат всегда будет Int
DПрограмма упадёт во время выполнения
2. Чему равно 7 / 2, если оба операнда имеют тип Int?
A3.5
B4
C3
Dошибка