Swift at the Interview: How Not to Lose Face
Imagine: you're sitting across from a team lead or HR manager, and suddenly the question comes up: "Tell me, what is the difference between a class and a struct in Swift?". It seems basic. But it's precisely on such "simple" questions that many candidates get lost. And if you add the pitfalls of ARC, closures, and optional types — a Swift interview can turn into a real ordeal.
In this article, we'll break down how to prepare for a Swift interview so you feel confident. You'll get not just theory, but real code examples, life hacks, and a checklist of topics to review before meeting with an employer.
Why Are Swift Interviews So Specific?
Swift is a young but very powerful language. It combines low-level memory management (ARC) with high-level abstractions (protocols, generics, functional programming). In an interview, you will be tested on several fronts at once:
- Basic syntax — optionals, enums, tuples, guard/if-let.
- Memory management — ARC, retain cycles, weak and unowned references.
- OOP and protocol-oriented programming — classes vs structs, extensions, protocols.
- Functional capabilities — closures, map/filter/reduce, async/await.
- iOS specifics — UIKit, ViewController lifecycle, Auto Layout.
The good news: all of this can be learned and practiced. Let's go!
Top 5 Topics You Need to Know Inside Out
1. Structs vs Classes: Battle of the Titans
This is perhaps the most common question in a Swift interview. Let's break it down with an example.
// Class — reference typeclass Car { var model: String init(model: String) { self.model = model }}
// Struct — value typestruct Bike { var model: String}
var myCar = Car(model: "Tesla")var sameCar = myCarsameCar.model = "BMW"print(myCar.model) // BMW — reference!
var myBike = Bike(model: "Stels")var sameBike = myBikesameBike.model = "Author"print(myBike.model) // Stels — copy!What's important to emphasize in the interview:
- Classes support inheritance, structs do not (but protocols do).
- Structs are value types, classes are reference types.
- Structs automatically have a memberwise initializer.
- For multithreading, structs are safer — no shared state.
2. ARC and Memory Management — The Main Pain Point for iOS Developers
Without understanding ARC (Automatic Reference Counting), there's nothing to do in a Swift interview. The most common problem is a retain cycle (circular reference).
class ProfileViewController { var onLogout: (() -> Void)? func setup() { // Attention! Strong reference to self inside the closure onLogout = { self.dismiss(animated: true) } }}How to fix it? Use [weak self]:
onLogout = { [weak self] in self?.dismiss(animated: true)}Typical ARC questions:
- What is the difference between weak and unowned?
- When does a retain cycle occur?
- How does ARC work with closures?
3. Closures — From Simple to Complex
Closures in Swift are anonymous functions that capture context. No callback or completion handler can do without them.
// Simple closurelet greeting = { (name: String) in print("Hello, \\(name)!")}greeting("Swift") // Hello, Swift!
// Sorting an arraylet numbers = [3, 1, 7, 2]let sorted = numbers.sorted { $0 < $1 }print(sorted) // [1, 2, 3, 7]Tricky question: "What t