Swift: приложения экосистемы Apple
Все объяснения, задачи и лабораторная в одном месте.
Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.
1. Optionals, value types и protocols
Объяснение
Optional явно представляет значение или его отсутствие. Struct имеет семантику значения, class — ссылочную. Protocol задаёт интерфейс поведения. Принудительное раскрытие optional опасно для внешних данных.
Задача для самостоятельного решения
Как обработать строку, которая не превращается в Int?
Показать разбор ответа
Использовать if let или guard let и вернуть понятную ошибку. Принудительное ! завершит приложение на обычном неверном вводе.
2. Collections, errors и generics
Объяснение
Generics сохраняют информацию о типе без дублирования алгоритмов. throws передаёт ошибку вызывающему коду. Коллекции со значимой семантикой могут использовать copy-on-write как оптимизацию реализации.
Задача для самостоятельного решения
Нужно ли считать копирование Array немедленным копированием всех элементов?
Показать разбор ответа
Нет: физическое хранилище может разделяться до изменения. Но наблюдаемая семантика должна оставаться семантикой независимых значений.
3. ARC, memory safety и performance
Объяснение
ARC считает сильные ссылки. Цикл между объектом и сохранённым замыканием может удерживать оба. weak-ссылка становится nil после освобождения объекта; unowned требует более строгой гарантии времени жизни.
Задача для самостоятельного решения
Как избежать цикла self→closure→self?
Показать разбор ответа
Использовать weak capture, если замыкание не должно продлевать жизнь self, и обработать отсутствие объекта. Выбор зависит от реального владельца операции.
4. Swift concurrency и actors
Объяснение
Actor изолирует изменяемое состояние. await может приостановить метод и допустить другое сообщение actor. Поэтому инвариант, проверенный до await, может потребовать повторной проверки после него.
Задача для самостоятельного решения
Можно ли считать баланс неизменным между проверкой и await сети?
Показать разбор ответа
Нет: actor reentrancy позволяет другим задачам изменить состояние. Резервируйте средства до ожидания либо повторно проверяйте условия при фиксации.
5. Сеть, Codable и persistence
Объяснение
Codable описывает преобразование структуры и представления. Успешное декодирование не гарантирует бизнес-корректности. Сетевой слой должен различать transport error, HTTP-статус и ошибку схемы.
Задача для самостоятельного решения
JSON содержит отрицательную цену допустимого числового типа. Достаточно ли Codable?
Показать разбор ответа
Нет: декодирование пройдёт, но доменная проверка должна отклонить отрицательное значение, если контракт допускает только неотрицательные цены.
6. Тесты, profiling и публикация
Объяснение
Unit-тест проверяет поведение на контролируемых зависимостях. Instruments помогает искать CPU, память и задержки интерфейса. Публикация требует проверки реального release build и его конфигурации.
Задача для самостоятельного решения
Почему тест debug build не заменяет release smoke test?
Показать разбор ответа
Оптимизация, настройки сервера, entitlement и подпись могут отличаться. Проверьте запуск, вход, сеть и восстановление состояния в сборке, которую получает пользователь.
Лабораторная работа
Подготовка
Swift toolchain. Сохраните main.swift и выполните swift main.swift.
Учебный пример
func parseCount(_ text: String) -> Int? {
guard let value = Int(text), value >= 0 else { return nil }
return value
}
print(parseCount("12") ?? -1)
print(parseCount("bad") ?? -1)Как работает пример и что ожидать
Вывод 12 и −1. Guard объединяет проверку формата и диапазона; −1 здесь только демонстрационный маркер вывода, не часть доменной модели. Optional позволяет вызывающему коду выбрать подходящее сообщение ошибки.
Итоговая работа
Создайте модель приложения с Codable, проверкой доменных данных и async-сетью. Добавьте тест отмены и устаревшего ответа, проверьте отсутствие retain cycle и сохранность данных при перезапуске.
Проверка результата
1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.
Как оценить работу
По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.