Экзаменационные вопросы
Только вопросы для самопроверки и опроса — части 1 и 2, без ответов и без разбивки на билеты.
Материалы охватывают весь курс (лекции 1–14): основы синтаксиса, коллекции, Optionals, ООП, протоколы, обобщения, обработку ошибок, ARC, конкурентность и SPM. Платформа — Linux, акцент на отличиях от Python.
- Часть 1. 25 простых вопросов (теория, короткий ответ)
- Часть 2. 25 сложных вопросов (углублённое понимание)
Часть 1. Простые вопросы (25)
1. В чём разница между var и let?
2. Какой тип выведет компилятор для литерала 42 и для 3.14?
3. Как в Swift записать строковую интерполяцию переменной name?
4. Что выведет print(type(of: 5))?
5. Можно ли в Swift сложить Int и Double напрямую: let x = 2 + 3.0?
6. Что делает оператор ???
7. Чем ..< отличается от ...?
8. Что такое Optional?
9. Что делает force unwrapping name!?
10. Как объявить массив целых чисел?
11. Чем Set отличается от Array?
12. Как объявить словарь со строковыми ключами и целыми значениями?
13. Что возвращает обращение к словарю по ключу dict["key"]?
14. Назовите два способа безопасно извлечь Optional.
15. Что такое guard и зачем он нужен?
16. Ключевое отличие struct от class?
17. Какое ключевое слово нужно при переопределении метода родителя?
18. Что делает final?
19. Чем raw value отличается от associated value в enum?
20. Что такое протокол?
21. Зачем нужны extensions?
22. Зачем нужны Generics?
23. Какие ключевые слова используются для обработки ошибок?
24. Что такое ARC?
25. Что делают async и await?
Часть 2. Сложные вопросы (25, без кода)
Вопросы на глубокое понимание. Сформулируйте ответ устно или письменно своими словами.
1. Почему массивы в Swift являются value type, но их копирование при присваивании остаётся дешёвым? Что меняет ситуацию?
2. Структура считается типом со значимой семантикой. Почему копия структуры, содержащей свойство-класс, всё равно может «делить» состояние с оригиналом?
3. Объясните разницу между захватом константы цикла и захватом изменяемой
переменной (var) в замыкании. Почему результаты могут отличаться?
4. Что такое witness table и как она связана с динамической диспетчеризацией методов протокола?
5. Метод, объявленный в требованиях протокола, и метод, добавленный только в extension протокола, диспетчеризуются по-разному. В чём разница и к каким сюрпризам она приводит?
6. Чем some Protocol отличается от any Protocol по смыслу, представлению в
памяти и диспетчеризации?
7. Почему протокол с associatedtype исторически нельзя было использовать как
обычный тип переменной, и какие есть способы это обойти?
8. Сравните weak и unowned: поведение при освобождении объекта, типы и
критерий выбора между ними.
9. Опишите типичный retain cycle с замыканием в классе и объясните, как список захвата его разрывает.
10. Что гарантирует actor в отношении своего изменяемого состояния и почему это не делает код полностью свободным от ошибок согласованности?
11. Почему два последовательных await не дают параллелизма, и какой механизм
запускает дочерние задачи действительно параллельно?
12. Что означает Sendable и почему замыкание, захватывающее изменяемое состояние
ссылочного типа, обычно не является @Sendable?
13. Опишите по шагам, как ARC определяет момент вызова deinit, на примере
нескольких сильных ссылок на один объект.
14. В чём разница между перегрузкой (overloading) и переопределением (overriding), и на каком этапе принимается решение о выборе реализации в каждом случае?
15. Почему два значения типа any Equatable нельзя сравнить через ==, а в
обобщённой функции с ограничением Equatable — можно?
16. Чем lazy var отличается от вычисляемого свойства, и почему обращение к lazy
у структуры считается мутирующей операцией?
17. Когда срабатывают наблюдатели willSet/didSet, а когда — нет? Сравните с
инициализацией и с присваиванием того же значения.
18. Зачем перечислению нужен модификатор indirect, и какую проблему он решает на
уровне представления типа?
19. Сравните модель обработки ошибок Swift (throws/try) с исключениями Python.
В чём принципиальные отличия с точки зрения типов и читаемости?
20. Объясните семантическую разницу между try?, try! и обычным пробросом
throws. Что теряется при использовании try??
21. Почему Set и ключи Dictionary не гарантируют порядок обхода, и какие
последствия это имеет для написания тестов и сериализации?
22. Чем map для Optional концептуально отличается от map для массива, и почему
их объединяют в одно семейство (функтор)?
23. Что такое designated и convenience инициализаторы, и какое правило делегирования между ними гарантирует корректную инициализацию при наследовании?
24. Почему обращение к значению словаря по ключу возвращает Optional, и как это связано с философией безопасности Swift?
25. Сравните полиморфизм через наследование классов и через протоколы (протоколо-ориентированное программирование). Какие ограничения наследования снимает POP?