Перейти к содержимому

Вопросы для самопроверки


Лекция 1. Введение в Swift и его экосистему

  1. В каком году был представлен Swift и кто является его создателем?
  2. Какие три ключевых принципа лежат в основе философии Swift?
  3. Чем отличается компилируемый язык от интерпретируемого? Приведите примеры каждого типа.
  4. Что такое статическая типизация и чем она отличается от динамической? Какие преимущества она даёт?
  5. На каких платформах (помимо macOS и iOS) может работать Swift?
  6. Какими способами можно запустить программу на Swift на Linux?
  7. В чём разница между let и var в Swift?
  8. Что такое интерполяция строк в Swift и как она записывается?
  9. Чем Swift REPL отличается от компиляции с помощью swiftc?
  10. Какова роль Swift Package Manager и когда его следует использовать?

Лекция 2. Переменные, константы и базовые типы данных

  1. Чем let отличается от var? Почему let рекомендуется по умолчанию?
  2. Какой тип выведет компилятор для 3.14? А для 42?
  3. Почему let x: Int = 5; let y: Double = 2.5; let z = x + y не компилируется?
  4. Чем \(expr) в Swift отличается от f"{expr}" в Python с точки зрения безопасности?
  5. Почему Swift не позволяет text[0] для доступа к символу строки?
  6. Чем String.count отличается от len() на строках с эмодзи?
  7. Что вернёт Int("hello") и почему это безопаснее, чем int("hello") в Python?
  8. Приведите пример, когда строгая типизация Swift предотвращает ошибку, которая в Python обнаружилась бы только при выполнении.

Лекция 3. Операторы и управление потоком выполнения

  1. Почему if count { } (где countInt) не скомпилируется?
  2. Что будет, если switch не покрывает все значения и нет default?
  3. Чем guard let отличается от if let по области видимости?
  4. Что делает fallthrough и когда его стоит избегать?
  5. Разница между stride(from:to:by:) и stride(from:through:by:)?
  6. Зачем нужны labeled statements?
  7. Чем repeat-while отличается от while?

Лекция 4. Функции и замыкания

  1. Чем отличается метка аргумента от имени параметра? Приведите пример.
  2. Для чего используется _ перед именем параметра?
  3. Как вариативные параметры (Type...) соотносятся с *args в Python?
  4. Что такое inout-параметр и зачем при вызове нужен &?
  5. Что означает тип (String, Int) -> Bool?
  6. Перечислите этапы сокращения синтаксиса замыкания.
  7. Что такое trailing closure и когда его удобно использовать?
  8. В чём разница между @escaping и non-escaping замыканиями?
  9. Для чего нужен @autoclosure?
  10. Почему замыкания в Swift мощнее, чем lambda в Python?

Лекция 5. Коллекции

  1. Чем Array в Swift отличается от list в Python с точки зрения типизации?
  2. Почему first и last у массива возвращают Optional, а не просто значение?
  3. Какая разница между var и let при объявлении коллекции?
  4. Перечислите четыре основные операции над множествами в Swift. Какие у них аналоги в Python?
  5. Почему доступ к словарю по ключу возвращает Optional? Как указать значение по умолчанию?
  6. Чем compactMap отличается от map? Приведите пример.
  7. Чем flatMap отличается от map? Когда его следует использовать?
  8. Как в Swift реализовать аналог Python-выражения [x ** 2 for x in range(10) if x % 2 == 0]?
  9. Почему подход Swift (строгая типизация коллекций) безопаснее, чем динамические списки Python?
  10. Что возвращает reduce и зачем ему нужно начальное значение?

Лекция 6. Optionals — безопасная работа с отсутствием значений

  1. Почему переменная типа String не может содержать nil в Swift?
  2. Что такое Optional<Int> и как это связано с записью Int??
  3. Почему Optional в Swift — это enum с двумя вариантами?
  4. В чём опасность оператора ! (force unwrapping)?
  5. Чем if let отличается от guard let? Когда предпочтительнее каждый?
  6. Что произойдёт, если в цепочке person?.address?.street свойство address равно nil?
  7. Чем ?? в Swift отличается от or в Python?
  8. Когда оправдано использование Type!?
  9. В чём разница между map и flatMap для Optional?
  10. Почему compactMap полезнее ручной фильтрации nil?
  11. Чем подход Swift к отсутствию значения отличается от Optional в модуле typing Python?

Лекция 7. Структуры и классы

  1. Чем отличается memberwise initializer от обычного init? У какого типа он генерируется автоматически?
  2. В чём разница между хранимыми и вычисляемыми свойствами?
  3. Когда вызываются willSet и didSet? Вызываются ли они при инициализации?
  4. Зачем нужно ключевое слово mutating для методов структуры?
  5. Что произойдёт, если структуру объявить как let и изменить её var-свойство?
  6. Чем отличается поведение присваивания для struct и class?
  7. Что проверяет оператор ===? Можно ли его применить к структуре?
  8. Какой оператор в Python аналогичен === в Swift?
  9. Почему Apple рекомендует по умолчанию использовать struct?
  10. Приведите три примера типов из стандартной библиотеки Swift, которые являются структурами.

Лекция 8. Наследование и полиморфизм

  1. Почему структуры в Swift не поддерживают наследование?
  2. Что произойдёт, если убрать override при переопределении метода?
  3. Чем as? отличается от as!? Когда использовать каждый?
  4. Объясните разницу между designated и convenience инициализаторами.
  5. Что такое двухфазная инициализация? Почему нельзя обращаться к self до super.init()?
  6. Для чего используется final? Какие преимущества даёт компилятору?
  7. Назовите три отличия модели наследования Swift от Python.
  8. Что такое MRO и почему в Swift он не нужен?
  9. Когда вызывается deinit? Чем он отличается от __del__ в Python?
  10. Приведите пример полиморфизма с переменной базового типа.

Лекция 9. Перечисления и Pattern Matching

  1. Чем перечисления Swift принципиально отличаются от Enum в Python?
  2. Что такое raw value? Какие типы могут быть raw value?
  3. Что возвращает init?(rawValue:) и почему он возвращает Optional?
  4. В чём разница между raw values и associated values? Можно ли использовать оба в одном enum?
  5. Что делает ключевое слово indirect? Когда оно необходимо?
  6. Как извлечь associated value из enum без полного switch?
  7. Объясните разницу между if case let и for case let.
  8. Для чего используется where в pattern matching?
  9. Почему enum хорошо подходит для моделирования конечных автоматов?
  10. Как бы вы реализовали аналог Swift enum с associated values в Python? Какие недостатки у такого подхода?

Лекция 10. Протоколы и расширения

  1. Чем протокол отличается от абстрактного класса? Почему в Swift нет ключевого слова abstract?
  2. Объясните разницу между { get } и { get set } в требованиях протокола к свойствам. Может ли let-свойство удовлетворить { get set }?
  3. Зачем нужно ключевое слово mutating в протоколах? Должен ли класс писать mutating при реализации?
  4. Что такое протоколо-ориентированное программирование (POP)? В чём его преимущества перед классическим ООП?
  5. Как использовать протокол в качестве типа переменной? Приведите пример с массивом протокольного типа.
  6. Что такое композиция протоколов (Protocol1 & Protocol2)? В каких случаях она полезна?
  7. Что можно, а что нельзя добавить через расширения (extensions)?
  8. Как работают реализации по умолчанию через расширения протоколов? Что произойдёт, если тип предоставит собственную реализацию?
  9. Что такое conditional conformance? Приведите пример с where.
  10. Сравните подход Swift (протоколы + расширения) с Python (duck typing + ABC + Protocol из typing). Какие преимущества и недостатки у каждого?

Лекция 11. Обобщения (Generics)

  1. Какую проблему решают обобщения в Swift?
  2. Что такое параметр типа и как он указывается?
  3. Может ли обобщённая функция иметь несколько параметров типа?
  4. Чем Stack<Element> отличается от структуры, работающей с Any?
  5. Как ограничить параметр типа протоколом Equatable?
  6. В чём разница между <T: Equatable> и where T: Equatable?
  7. Что такое associatedtype и когда он используется?
  8. Почему для ключей Dictionary требуется Key: Hashable?
  9. Чем some Protocol отличается от any Protocol?
  10. Как обобщения Swift отличаются от typing.Generic в Python?

Лекция 12. Обработка ошибок и управление памятью

  1. Чем отличается try, try? и try!? В каких ситуациях уместен каждый?
  2. Почему defer считается более гибким, чем finally в Python?
  3. Что произойдёт, если в функции несколько defer-блоков? В каком порядке они выполнятся?
  4. Чем throws отличается от rethrows?
  5. Когда Result предпочтительнее throws?
  6. Что такое ARC и к каким типам он применяется?
  7. Почему циклические ссылки приводят к утечке памяти при ARC?
  8. Чем weak отличается от unowned? Когда использовать каждый?
  9. Как избежать retain cycle в замыканиях? Что такое capture list?
  10. Чем ARC в Swift отличается от сборщика мусора в Python?

Лекция 13. Конкурентность и асинхронное программирование

  1. Чем отличается конкурентность от параллелизма?
  2. Что такое race condition и data race? В чём разница?
  3. Чем async/await в Swift отличается от async/await в Python?
  4. Что происходит в точке await — блокируется ли поток?
  5. В чём разница между async let и последовательными await?
  6. Чем Task { } отличается от Task.detached { }?
  7. Почему отмена задач в Swift называется «кооперативной»?
  8. Когда TaskGroup предпочтительнее async let?
  9. Чем actor отличается от class? Какую проблему он решает?
  10. Что такое nonisolated и когда его применять?
  11. Зачем нужен протокол Sendable?
  12. Чем реальный параллелизм Swift отличается от event loop в Python asyncio?

Лекция 14. Экосистема Swift и итоговый проект

  1. Какой командой создаётся новый исполняемый Swift-пакет?
  2. В каком файле описываются зависимости проекта? На каком языке он написан?
  3. Чем swift build отличается от swift run?
  4. Какие протоколы стандартной библиотеки обеспечивают итерирование и индексный доступ?
  5. Что даёт import FoundationEssentials по сравнению с import Foundation?
  6. Назовите два фреймворка для серверной разработки на Swift.
  7. Почему рекомендуется использовать struct по умолчанию?
  8. Чем guard let лучше вложенных if let?
  9. Почему следует избегать force unwrapping (!)?
  10. Какие соглашения об именовании приняты для типов и переменных в Swift?