Swift на собеседовании: как не ударить в грязь лицом
Представьте: вы сидите напротив тимлида или HR-менеджера, и вдруг звучит вопрос: "Расскажите, чем отличается класс от структуры в Swift?". Казалось бы, база. Но именно на таких "простых" вопросах многие кандидаты теряются. А если добавить сюда граблей с ARC, замыканиями и опциональными типами — собеседование по Swift может превратиться в настоящее испытание.
В этой статье мы разберём, как подготовиться к собеседованию по Swift так, чтобы чувствовать себя уверенно. Вы получите не просто теорию, а реальные примеры кода, лайфхаки и чек-лист тем, которые нужно повторить перед встречей с работодателем.
Почему собеседования по Swift такие специфичные?
Swift — язык молодой, но очень мощный. Он совмещает низкоуровневое управление памятью (ARC) с высокоуровневыми абстракциями (протоколы, дженерики, функциональщина). На собеседовании вас будут проверять сразу в нескольких плоскостях:
- Базовый синтаксис — опционалы, перечисления, кортежи, guard/if-let.
- Управление памятью — ARC, retain cycles, слабые и безымянные ссылки.
- ООП и протокол-ориентированное программирование — классы vs структуры, расширения, протоколы.
- Функциональные возможности — замыкания, map/filter/reduce, async/await.
- iOS-специфика — UIKit, жизненный цикл ViewController, Auto Layout.
Хорошая новость: всё это можно выучить и натренировать. Поехали!
Топ-5 тем, которые нужно знать на зубок
1. Структуры vs Классы: битва титанов
Это, пожалуй, самый частый вопрос на собеседовании по Swift. Давайте разберём на примере.
// Класс — ссылочный тип
class Car {
var model: String
init(model: String) { self.model = model }
}
// Структура — значимый тип
struct Bike {
var model: String
}
var myCar = Car(model: "Tesla")
var sameCar = myCar
sameCar.model = "BMW"
print(myCar.model) // BMW — ссылка!
var myBike = Bike(model: "Stels")
var sameBike = myBike
sameBike.model = "Author"
print(myBike.model) // Stels — копия!
Что важно подчеркнуть на собеседовании:
- Классы поддерживают наследование, структуры — нет (но есть протоколы).
- Структуры — value types, классы — reference types.
- Структуры автоматически имеют memberwise initializer.
- Для многопоточности структуры безопаснее — нет shared state.
2. ARC и управление памятью — главная боль iOS-разработчика
Без понимания ARC (Automatic Reference Counting) на собеседовании по Swift делать нечего. Самая частая проблема — retain cycle (циклическая ссылка).
class ProfileViewController {
var onLogout: (() -> Void)?
func setup() {
// Внимание! Сильная ссылка на self внутри замыкания
onLogout = {
self.dismiss(animated: true)
}
}
}
Как исправить? Использовать [weak self]:
onLogout = { [weak self] in
self?.dismiss(animated: true)
}
Типичные вопросы по ARC:
- Чем отличается weak от unowned?
- Когда возникает retain cycle?
- Как ARC работает с замыканиями?
3. Замыкания (Closures) — от простого к сложному
Замыкания в Swift — это анонимные функции, которые захватывают контекст. Без них не обходится ни один callback или completion handler.
// Простое замыкание
let greeting = { (name: String) in
print("Hello, \(name)!")
}
greeting("Swift") // Hello, Swift!
// Сортировка массива
let numbers = [3, 1, 7, 2]
let sorted = numbers.sorted { $0 < $1 }
print(sorted) // [1, 2, 3, 7]
Хитрый вопрос: "Что такое escaping closure?"
Ответ: замыкание, которое может быть вызвано после возврата из функции. Например, при асинхронном запросе:
func fetchData(completion: @escaping (Data) -> Void) {
DispatchQueue.global().async {
// ... долгая операция
completion(data)
}
}
4. Опциональные типы — безопасность превыше всего
Swift создавался как безопасный язык. Опционалы — его визитная карточка. На собеседовании вас обязательно спросят про ? и !.
var name: String? = "Alice"
var unwrappedName: String = name! // Force unwrap — опасно!
// Безопасный способ
if let safeName = name {
print("Hello, \(safeName)")
}
// Guard let — для раннего выхода
guard let safeName = name else { return }
print("Hello, \(safeName)")
Лайфхак: Никогда не используйте force unwrap в продакшне, если не уверены на 100%. На собеседовании это будет плюсом.
5. Протокол-ориентированное программирование (POP)
Swift отказался от множественного наследования в пользу протоколов. Это мощный инструмент, который нужно уметь использовать.
protocol Flyable {
var speed: Int { get }
func fly()
}
extension Flyable {
func fly() {
print("Flying at \(speed) km/h")
}
}
struct Bird: Flyable {
var speed: Int = 50
}
let sparrow = Bird(speed: 30)
sparrow.fly() // Flying at 30 km/h
Вопрос на засыпку: "Protocols with associated types — что это и зачем?"
Ответ: PAT (Protocol with Associated Types) позволяет делать протоколы обобщёнными. Например, Collection — это протокол с ассоциированным типом Element.
iOS-специфика: что спрашивают чаще всего
Если вы претендуете на позицию iOS-разработчика, к вопросам по Swift добавятся темы, связанные с UIKit и архитектурой приложений.
Жизненный цикл UIViewController
Знать порядок вызовов методов — обязательно:
viewDidLoad()— один раз при создании view.viewWillAppear(_:)— каждый раз перед появлением.viewDidAppear(_:)— после появления.viewWillDisappear(_:)иviewDidDisappear(_:)— при уходе.