Skip to content

День 4 — Сложные типы данных, часть 2

Сегодня закрепим коллекции и научимся точнее управлять типами. Выбор между Array, Dictionary и Set — это описание смысла данных, а не вопрос вкуса.

Type annotations для коллекций

Полная форма типа показывает, какие элементы разрешены.

swift
var cities: [String] = ["Москва", "Тула"]
var distances: [String: Int] = ["Москва": 0, "Тула": 193]
var uniqueCodes: Set<Int> = [101, 202, 303]

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

swift
var measurements: [Double] = []
let ratio: Double = 3

Без : Double число 3 стало бы Int.

Тип нельзя поменять позже

Swift — statically typed language: тип известен во время компиляции и остаётся тем же.

swift
var names = ["Маша", "Саша"]
names.append("Даша")
// names.append(42) // Ошибка: ожидается String

Это ограничение делает API предсказуемым: получая [String], функция знает, какие операции доступны каждому элементу.

Как выбрать коллекцию

Задайте три вопроса:

  1. Нужен порядок и доступ по позиции? Берите Array.
  2. Нужна связь ключа со значением? Dictionary.
  3. Нужны уникальность и быстрая проверка принадлежности? Set.
swift
let queue = ["Первый", "Второй"]             // порядок важен
let capitals = ["Россия": "Москва"]          // поиск по стране
let grantedPermissions: Set = ["camera"]     // повтор бессмысленен

Изменяемость коллекции

let запрещает менять саму коллекцию, включая добавление и удаление элементов.

swift
let fixedNumbers = [1, 2, 3]
// fixedNumbers.append(4)

var growingNumbers = [1, 2, 3]
growingNumbers.append(4)

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

Проверка количества и уникальности

У Array есть count, а преобразование в Set удаляет дубликаты.

swift
let names = ["Аня", "Борис", "Аня", "Вера"]
let uniqueNames = Set(names)

print(names.count)       // 4
print(uniqueNames.count) // 3

Важно: преобразованный Set не обязан сохранять исходный порядок.

Практика

Checkpoint

Условие

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

Что нужно знать

  • свойство count;
  • создание Set из Array;
  • интерполяция строк.
Показать подсказку

Set(cities) создаст множество из элементов Array и отбросит повторы. Сохраните результат в отдельную константу.

Показать решение
swift
let cities = ["Москва", "Казань", "Тула", "Москва", "Казань"]
let uniqueCities = Set(cities)

print("Всего: \(cities.count)")
print("Уникальных: \(uniqueCities.count)")

Здесь всего пять записей, но только три уникальных города.

Краткое повторение

  • тип хранится не в переменной отдельно от значения: он задаёт правила работы с этим значением;
  • type inference удобен, пока намерение очевидно;
  • type annotation нужна для пустых коллекций и осознанного выбора типа;
  • Array, Dictionary и Set кодируют разные отношения между элементами;
  • enum задаёт конечный набор состояний и помогает исключить недопустимые варианты.

Что запомнить

Хорошо выбранный тип предотвращает ошибку ещё до того, как вы напишете if для её обработки.

Tuple и type alias

Tuple подходит для короткого локального результата, а type alias делает сложное имя понятнее:

swift
typealias UserID = UUID
typealias Score = (correct: Int, total: Int)

let result: Score = (correct: 8, total: 10)

Если к данным добавляются правила, methods или новые поля, замените tuple отдельным struct. Это удерживает модель понятной по мере роста проекта.

Переход между соседними страницами: и вне полей ввода.

ОБСУЖДЕНИЕ

Комментарии

Вопросы, находки и подсказки по этой странице.

Загружаем комментарии…