Практика 5. Практика к лекции 5
Цель: закрепить работу с коллекциями Swift — массивами, множествами и словарями — а также освоить функциональные методы (map, filter, reduce, compactMap, flatMap, sorted, contains) через серию упражнений от базовых к проектным.
Рекомендации по выполнению:
- Выполняйте задания в отдельных файлах
.swift(например,task1.swift,task2.swift). - Запускайте через терминал:
swift task1.swift(илиswift имя_файла.swift). - Для проектов из нескольких файлов используйте Swift Package Manager (
swift package init --type executable). - Работа ведётся на Linux — Xcode не требуется, достаточно установленного Swift toolchain.
- Сопровождайте решения проверочными
print-выражениями илиassert-ами.
A. Разминка
- Создайте массив целых чисел от 1 до 20. С помощью
filterотберите числа, делящиеся на 3, затем с помощьюreduceнайдите их сумму.
let numbers = Array(1...20)// Ожидаемый результат: 3 + 6 + 9 + 12 + 15 + 18 = 63- Дан массив строк — названия городов. Используя
mapиsorted, получите массив строк вида"ГОРОД (N букв)", отсортированный по длине названия.
let cities = ["Москва", "Уфа", "Новосибирск", "Казань", "Сочи"]// Ожидаемый результат:// ["УФА (3 букв)", "СОЧИ (4 букв)", "КАЗАНЬ (6 букв)", "МОСКВА (6 букв)", "НОВОСИБИРСК (11 букв)"]B. Множества
- Дано два множества
Set<String>— навыки двух программистов. Найдите: (а) общие навыки, (б) уникальные навыки каждого, (в) все навыки вместе. Выведите результат каждой операции.
let dev1: Set = ["Swift", "Python", "Git", "SQL", "Docker"]let dev2: Set = ["Python", "JavaScript", "Git", "React", "Docker"]// Общие: {"Python", "Git", "Docker"}// Уникальные dev1: {"Swift", "SQL"}// Уникальные dev2: {"JavaScript", "React"}// Все вместе: {"Swift", "Python", "Git", "SQL", "Docker", "JavaScript", "React"}- Дан массив целых чисел с повторениями. Используя
Set, удалите дубликаты и верните отсортированный массив. Затем проверьте, является ли полученное множество надмножеством множества[1, 2, 3](методisSuperset(of:)).
let raw = [5, 3, 1, 3, 2, 5, 4, 1, 2, 4]// Уникальные (отсортированные): [1, 2, 3, 4, 5]// Является надмножеством [1, 2, 3]: trueC. Словари
- Создайте словарь
[String: [Int]], где ключ — имя студента, значение — массив оценок. С помощьюmapValues(илиmap+reduce) создайте новый словарь[String: Double]со средними оценками каждого студента.
let grades = [ "Анна": [90, 85, 92, 88], "Борис": [70, 65, 80, 75], "Виктор": [95, 100, 92, 98]]// Ожидаемый результат: ["Анна": 88.75, "Борис": 72.5, "Виктор": 96.25]- Дан массив слов. Постройте частотный словарь
[String: Int], подсчитывающий количество вхождений каждого слова. Выведите топ-3 самых частых слова с помощьюsorted(by:)иprefix.
let words = ["swift", "python", "swift", "go", "python", "swift", "rust", "go", "python", "swift"]// Ожидаемый результат:// swift: 4// python: 3// go: 2D. compactMap и flatMap
- Дан массив опциональных строк. Используя
compactMap, извлеките непустые значения и преобразуйте их в верхний регистр.
let input: [String?] = ["swift", nil, "python", nil, "go", nil]// Ожидаемый результат: ["SWIFT", "PYTHON", "GO"]- Дан массив массивов целых чисел. Используя
flatMap, объедините их в один массив, затем с помощьюfilterоставьте только чётные числа и отсортируйте по убыванию.
let nested = [[5, 2, 8], [1, 9, 3], [4, 7, 6]]// После flatMap: [5, 2, 8, 1, 9, 3, 4, 7, 6]// Чётные по убыванию: [8, 6, 4, 2]E. Цепочки функциональных преобразований
- Напишите цепочку функциональных вызовов, которая из строки текста извлекает все слова длиной больше 4 символов, убирает дубликаты и возвращает отсортированный массив в нижнем регистре.
let text = "Swift это Swift язык для разработки приложений для Apple и Linux"// Ожидаемый результат: ["apple", "linux", "swift", "приложений", "разработки"]Подсказка: разбейте строку через split(separator: " "), преобразуйте в [String], примените filter, map, затем Set для уникальности и sorted.
F. Мини-проект
- «Каталог товаров» — реализуйте следующую логику:
Определите структуру Product:
struct Product { let name: String let category: String let price: Double let inStock: Bool}Создайте массив из 8–10 товаров разных категорий. Реализуйте следующие запросы, используя только функциональные методы (filter, map, reduce, sorted и т.д.) — без циклов for:
- Все товары в наличии, отсортированные по цене (по возрастанию).
- Названия товаров дороже 1000 ₽ в верхнем регистре.
- Средняя цена товаров в каждой категории (результат — словарь
[String: Double]). - Самый дорогой товар (
max(by:)илиsorted). - Строка-отчёт:
"Всего товаров: N, в наличии: M, средняя цена: X ₽".
Пример вывода:
// В наличии (по цене): [Кабель (150.0), Мышь (800.0), Клавиатура (2500.0), Монитор (25000.0)]// Дорогие товары: ["КЛАВИАТУРА", "МОНИТОР", "НОУТБУК"]// Средние цены: ["Аксессуары": 475.0, "Периферия": 9433.33, ...]// Самый дорогой: Ноутбук (75000.0)// Отчёт: "Всего товаров: 10, в наличии: 7, средняя цена: 12340.0 ₽"Критерии оценивания
- Корректность и полнота реализации: 0–5 баллов
- Использование функциональных методов коллекций (
map,filter,reduce,compactMapи др.): 0–5 баллов - Качество и читаемость кода (именование переменных, форматирование, комментарии): 0–3 балла
- Наличие проверочных
print/assertвыражений: 0–3 балла
Максимум: 16 баллов. Бонус до +2 за дополнительные задания.
Дополнительно (по желанию)
- Реализуйте задание 10 как Swift Package (
swift package init --type executable) с разделением кода на модули. - Добавьте в мини-проект функцию поиска товаров по подстроке в названии (используйте
filter+contains). - Реализуйте аналог Python-генератора
[x ** 2 for x in range(20) if x % 2 == 0]с помощью цепочкиfilter→map.