IT Academy
Справочник курса

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 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.