День 4 — Сложные типы данных, часть 2
Сегодня закрепим коллекции и научимся точнее управлять типами. Выбор между Array, Dictionary и Set — это описание смысла данных, а не вопрос вкуса.
Type annotations для коллекций
Полная форма типа показывает, какие элементы разрешены.
var cities: [String] = ["Москва", "Тула"]
var distances: [String: Int] = ["Москва": 0, "Тула": 193]
var uniqueCodes: Set<Int> = [101, 202, 303]Обычно Swift выведет эти типы сам. Аннотация особенно полезна у пустого значения или когда литерал допускает несколько трактовок.
var measurements: [Double] = []
let ratio: Double = 3Без : Double число 3 стало бы Int.
Тип нельзя поменять позже
Swift — statically typed language: тип известен во время компиляции и остаётся тем же.
var names = ["Маша", "Саша"]
names.append("Даша")
// names.append(42) // Ошибка: ожидается StringЭто ограничение делает API предсказуемым: получая [String], функция знает, какие операции доступны каждому элементу.
Как выбрать коллекцию
Задайте три вопроса:
- Нужен порядок и доступ по позиции? Берите Array.
- Нужна связь ключа со значением? Dictionary.
- Нужны уникальность и быстрая проверка принадлежности? Set.
let queue = ["Первый", "Второй"] // порядок важен
let capitals = ["Россия": "Москва"] // поиск по стране
let grantedPermissions: Set = ["camera"] // повтор бессмыслененИзменяемость коллекции
let запрещает менять саму коллекцию, включая добавление и удаление элементов.
let fixedNumbers = [1, 2, 3]
// fixedNumbers.append(4)
var growingNumbers = [1, 2, 3]
growingNumbers.append(4)Выбирайте let, когда набор должен оставаться фиксированным. Это такое же полезное ограничение, как для одиночного значения.
Проверка количества и уникальности
У Array есть count, а преобразование в Set удаляет дубликаты.
let names = ["Аня", "Борис", "Аня", "Вера"]
let uniqueNames = Set(names)
print(names.count) // 4
print(uniqueNames.count) // 3Важно: преобразованный Set не обязан сохранять исходный порядок.
Checkpoint
Условие
Создайте Array строк с названиями городов. Добавьте хотя бы один повтор. Выведите общее количество элементов и количество уникальных городов.
Что нужно знать
- свойство
count; - создание
Setиз Array; - интерполяция строк.
Показать подсказку
Set(cities) создаст множество из элементов Array и отбросит повторы. Сохраните результат в отдельную константу.
Показать решение
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 делает сложное имя понятнее:
typealias UserID = UUID
typealias Score = (correct: Int, total: Int)
let result: Score = (correct: 8, total: 10)Если к данным добавляются правила, methods или новые поля, замените tuple отдельным struct. Это удерживает модель понятной по мере роста проекта.
Комментарии
Вопросы, находки и подсказки по этой странице.
Войди, чтобы задать вопрос или помочь другим.