Перейти к содержимому
Лекция 1. Введение в Swift и его экосистему
- В каком году был представлен Swift и кто является его создателем?
- Какие три ключевых принципа лежат в основе философии Swift?
- Чем отличается компилируемый язык от интерпретируемого? Приведите примеры каждого типа.
- Что такое статическая типизация и чем она отличается от динамической? Какие преимущества она даёт?
- На каких платформах (помимо macOS и iOS) может работать Swift?
- Какими способами можно запустить программу на Swift на Linux?
- В чём разница между
let и var в Swift?
- Что такое интерполяция строк в Swift и как она записывается?
- Чем Swift REPL отличается от компиляции с помощью
swiftc?
- Какова роль Swift Package Manager и когда его следует использовать?
Лекция 2. Переменные, константы и базовые типы данных
- Чем
let отличается от var? Почему let рекомендуется по умолчанию?
- Какой тип выведет компилятор для
3.14? А для 42?
- Почему
let x: Int = 5; let y: Double = 2.5; let z = x + y не компилируется?
- Чем
\(expr) в Swift отличается от f"{expr}" в Python с точки зрения безопасности?
- Почему Swift не позволяет
text[0] для доступа к символу строки?
- Чем
String.count отличается от len() на строках с эмодзи?
- Что вернёт
Int("hello") и почему это безопаснее, чем int("hello") в Python?
- Приведите пример, когда строгая типизация Swift предотвращает ошибку, которая в Python обнаружилась бы только при выполнении.
Лекция 3. Операторы и управление потоком выполнения
- Почему
if count { } (где count — Int) не скомпилируется?
- Что будет, если
switch не покрывает все значения и нет default?
- Чем
guard let отличается от if let по области видимости?
- Что делает
fallthrough и когда его стоит избегать?
- Разница между
stride(from:to:by:) и stride(from:through:by:)?
- Зачем нужны labeled statements?
- Чем
repeat-while отличается от while?
Лекция 4. Функции и замыкания
- Чем отличается метка аргумента от имени параметра? Приведите пример.
- Для чего используется
_ перед именем параметра?
- Как вариативные параметры (
Type...) соотносятся с *args в Python?
- Что такое
inout-параметр и зачем при вызове нужен &?
- Что означает тип
(String, Int) -> Bool?
- Перечислите этапы сокращения синтаксиса замыкания.
- Что такое trailing closure и когда его удобно использовать?
- В чём разница между
@escaping и non-escaping замыканиями?
- Для чего нужен
@autoclosure?
- Почему замыкания в Swift мощнее, чем
lambda в Python?
Лекция 5. Коллекции
- Чем
Array в Swift отличается от list в Python с точки зрения типизации?
- Почему
first и last у массива возвращают Optional, а не просто значение?
- Какая разница между
var и let при объявлении коллекции?
- Перечислите четыре основные операции над множествами в Swift. Какие у них аналоги в Python?
- Почему доступ к словарю по ключу возвращает
Optional? Как указать значение по умолчанию?
- Чем
compactMap отличается от map? Приведите пример.
- Чем
flatMap отличается от map? Когда его следует использовать?
- Как в Swift реализовать аналог Python-выражения
[x ** 2 for x in range(10) if x % 2 == 0]?
- Почему подход Swift (строгая типизация коллекций) безопаснее, чем динамические списки Python?
- Что возвращает
reduce и зачем ему нужно начальное значение?
Лекция 6. Optionals — безопасная работа с отсутствием значений
- Почему переменная типа
String не может содержать nil в Swift?
- Что такое
Optional<Int> и как это связано с записью Int??
- Почему
Optional в Swift — это enum с двумя вариантами?
- В чём опасность оператора
! (force unwrapping)?
- Чем
if let отличается от guard let? Когда предпочтительнее каждый?
- Что произойдёт, если в цепочке
person?.address?.street свойство address равно nil?
- Чем
?? в Swift отличается от or в Python?
- Когда оправдано использование
Type!?
- В чём разница между
map и flatMap для Optional?
- Почему
compactMap полезнее ручной фильтрации nil?
- Чем подход Swift к отсутствию значения отличается от
Optional в модуле typing Python?
Лекция 7. Структуры и классы
- Чем отличается memberwise initializer от обычного
init? У какого типа он генерируется автоматически?
- В чём разница между хранимыми и вычисляемыми свойствами?
- Когда вызываются
willSet и didSet? Вызываются ли они при инициализации?
- Зачем нужно ключевое слово
mutating для методов структуры?
- Что произойдёт, если структуру объявить как
let и изменить её var-свойство?
- Чем отличается поведение присваивания для struct и class?
- Что проверяет оператор
===? Можно ли его применить к структуре?
- Какой оператор в Python аналогичен
=== в Swift?
- Почему Apple рекомендует по умолчанию использовать struct?
- Приведите три примера типов из стандартной библиотеки Swift, которые являются структурами.
Лекция 8. Наследование и полиморфизм
- Почему структуры в Swift не поддерживают наследование?
- Что произойдёт, если убрать
override при переопределении метода?
- Чем
as? отличается от as!? Когда использовать каждый?
- Объясните разницу между designated и convenience инициализаторами.
- Что такое двухфазная инициализация? Почему нельзя обращаться к
self до super.init()?
- Для чего используется
final? Какие преимущества даёт компилятору?
- Назовите три отличия модели наследования Swift от Python.
- Что такое MRO и почему в Swift он не нужен?
- Когда вызывается
deinit? Чем он отличается от __del__ в Python?
- Приведите пример полиморфизма с переменной базового типа.
Лекция 9. Перечисления и Pattern Matching
- Чем перечисления Swift принципиально отличаются от
Enum в Python?
- Что такое raw value? Какие типы могут быть raw value?
- Что возвращает
init?(rawValue:) и почему он возвращает Optional?
- В чём разница между raw values и associated values? Можно ли использовать оба в одном enum?
- Что делает ключевое слово
indirect? Когда оно необходимо?
- Как извлечь associated value из enum без полного
switch?
- Объясните разницу между
if case let и for case let.
- Для чего используется
where в pattern matching?
- Почему enum хорошо подходит для моделирования конечных автоматов?
- Как бы вы реализовали аналог Swift enum с associated values в Python? Какие недостатки у такого подхода?
Лекция 10. Протоколы и расширения
- Чем протокол отличается от абстрактного класса? Почему в Swift нет ключевого слова
abstract?
- Объясните разницу между
{ get } и { get set } в требованиях протокола к свойствам. Может ли let-свойство удовлетворить { get set }?
- Зачем нужно ключевое слово
mutating в протоколах? Должен ли класс писать mutating при реализации?
- Что такое протоколо-ориентированное программирование (POP)? В чём его преимущества перед классическим ООП?
- Как использовать протокол в качестве типа переменной? Приведите пример с массивом протокольного типа.
- Что такое композиция протоколов (
Protocol1 & Protocol2)? В каких случаях она полезна?
- Что можно, а что нельзя добавить через расширения (extensions)?
- Как работают реализации по умолчанию через расширения протоколов? Что произойдёт, если тип предоставит собственную реализацию?
- Что такое
conditional conformance? Приведите пример с where.
- Сравните подход Swift (протоколы + расширения) с Python (duck typing + ABC +
Protocol из typing). Какие преимущества и недостатки у каждого?
Лекция 11. Обобщения (Generics)
- Какую проблему решают обобщения в Swift?
- Что такое параметр типа и как он указывается?
- Может ли обобщённая функция иметь несколько параметров типа?
- Чем
Stack<Element> отличается от структуры, работающей с Any?
- Как ограничить параметр типа протоколом
Equatable?
- В чём разница между
<T: Equatable> и where T: Equatable?
- Что такое
associatedtype и когда он используется?
- Почему для ключей
Dictionary требуется Key: Hashable?
- Чем
some Protocol отличается от any Protocol?
- Как обобщения Swift отличаются от
typing.Generic в Python?
Лекция 12. Обработка ошибок и управление памятью
- Чем отличается
try, try? и try!? В каких ситуациях уместен каждый?
- Почему
defer считается более гибким, чем finally в Python?
- Что произойдёт, если в функции несколько
defer-блоков? В каком порядке они выполнятся?
- Чем
throws отличается от rethrows?
- Когда
Result предпочтительнее throws?
- Что такое ARC и к каким типам он применяется?
- Почему циклические ссылки приводят к утечке памяти при ARC?
- Чем
weak отличается от unowned? Когда использовать каждый?
- Как избежать retain cycle в замыканиях? Что такое capture list?
- Чем ARC в Swift отличается от сборщика мусора в Python?
Лекция 13. Конкурентность и асинхронное программирование
- Чем отличается конкурентность от параллелизма?
- Что такое race condition и data race? В чём разница?
- Чем
async/await в Swift отличается от async/await в Python?
- Что происходит в точке
await — блокируется ли поток?
- В чём разница между
async let и последовательными await?
- Чем
Task { } отличается от Task.detached { }?
- Почему отмена задач в Swift называется «кооперативной»?
- Когда
TaskGroup предпочтительнее async let?
- Чем
actor отличается от class? Какую проблему он решает?
- Что такое
nonisolated и когда его применять?
- Зачем нужен протокол
Sendable?
- Чем реальный параллелизм Swift отличается от event loop в Python
asyncio?
Лекция 14. Экосистема Swift и итоговый проект
- Какой командой создаётся новый исполняемый Swift-пакет?
- В каком файле описываются зависимости проекта? На каком языке он написан?
- Чем
swift build отличается от swift run?
- Какие протоколы стандартной библиотеки обеспечивают итерирование и индексный доступ?
- Что даёт
import FoundationEssentials по сравнению с import Foundation?
- Назовите два фреймворка для серверной разработки на Swift.
- Почему рекомендуется использовать
struct по умолчанию?
- Чем
guard let лучше вложенных if let?
- Почему следует избегать force unwrapping (
!)?
- Какие соглашения об именовании приняты для типов и переменных в Swift?