Back to all Roadmaps
SDE 1 & SDE 2
Junior / Associate Roadmap
Code safety, core language execution mechanics, and writing stable, production-ready features under structural guidance. Includes the full Swift Foundations, UIKit/SwiftUI, Networking, and Git competency stacks.
Swift Language Foundations
Variables & Constants
let — Immutable
var — Mutable
Type Inference
Type Annotations
String & Character
Int, UInt, Int64
Double & Float
Bool
Tuple
let — Immutable
var — Mutable
Type Inference
Type Annotations
Variables & Constants
String & Character
Int, UInt, Int64
Double & Float
Bool
Tuple
Control Flow
if / else if / else
switch & Pattern Matching
guard Statement★
Ternary Operator
for-in Loop
while Loop
repeat-while
break & continue
Labeled Statements
if / else if / else
switch & Pattern Matching
guard Statement★
Ternary Operator
Control Flow
for-in Loop
while Loop
repeat-while
break & continue
Labeled Statements
Functions
Parameter Labels
Default Values
Variadic Parameters
inout Parameters
Closure Syntax★
Trailing Closures
@escaping Closures
@autoclosure
Capture Lists
Parameter Labels
Default Values
Variadic Parameters
inout Parameters
Functions
Closure Syntax★
Trailing Closures
@escaping Closures
@autoclosure
Capture Lists
Optionals★
if let binding
guard let binding
Multiple Bindings
Nil Coalescing ??
Optional Chaining ?.
Force Unwrap ! (avoid)
Optional map / flatMap
Optional as Enum (.some/.none)
if let binding
guard let binding
Multiple Bindings
Nil Coalescing ??
Optionals★
Optional Chaining ?.
Force Unwrap ! (avoid)
Optional map / flatMap
Optional as Enum (.some/.none)
Object-Oriented Programming
Classes & Structs
init & deinit
Inheritance & override
final & class methods
Reference Semantics
Value Semantics★
Memberwise Init
mutating Methods
Copy-on-Write (CoW)
init & deinit
Inheritance & override
final & class methods
Reference Semantics
Classes & Structs
Value Semantics★
Memberwise Init
mutating Methods
Copy-on-Write (CoW)
Enumerations
Raw Values (String, Int)
Associated Values★
CaseIterable
Stored Properties
Computed Properties
Lazy Properties
willSet & didSet Observers
Raw Values (String, Int)
Associated Values★
CaseIterable
Enumerations
Stored Properties
Computed Properties
Lazy Properties
willSet & didSet Observers
Collections & Algorithms
Swift Collections
Array — append/remove/insert
ArraySlice & Ranges
Set — union/intersection
Dictionary — keyed access
map & compactMap★
filter
reduce & reduce(into:)
flatMap
sorted & sort(by:)
Array — append/remove/insert
ArraySlice & Ranges
Set — union/intersection
Dictionary — keyed access
Swift Collections
map & compactMap★
filter
reduce & reduce(into:)
flatMap
sorted & sort(by:)
Protocols, Generics & Extensions
Protocols★
Protocol Conformance
Protocol Inheritance
Delegation Pattern
Equatable & Comparable
Hashable & Identifiable
Codable / Encodable / Decodable★
CustomStringConvertible
Protocol Conformance
Protocol Inheritance
Delegation Pattern
Protocols★
Equatable & Comparable
Hashable & Identifiable
Codable / Encodable / Decodable★
CustomStringConvertible
Extending Types
Protocol Extensions★
Default Implementations
Generic Functions <T>
Generic Types & Constraints
where Clauses
Extending Types
Protocol Extensions★
Default Implementations
Generic Functions <T>
Generic Types & Constraints
where Clauses
Error Handling & Result Types
Error Handling
Error Protocol & Custom Errors
throws & rethrows
try / catch / finally
try? & try! variants
Result<Success, Failure>★
Result.map & flatMap
Result.get()
Error Protocol & Custom Errors
throws & rethrows
try / catch / finally
try? & try! variants
Error Handling
Result<Success, Failure>★
Result.map & flatMap
Result.get()
UIKit Essentials
ViewController Lifecycle★
loadView()
viewDidLoad()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewWillAppear()
viewDidAppear()
viewWillDisappear()
viewDidDisappear()
loadView()
viewDidLoad()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
ViewController Lifecycle★
viewWillAppear()
viewDidAppear()
viewWillDisappear()
viewDidDisappear()
Core UI Components
UIView & frame/bounds
UILabel & NSAttributedString
UIButton & actions
UITextField & UITextView
UIImageView & content modes
UIScrollView & contentOffset
UISwitch & UISlider
UIActivityIndicatorView
UIView & frame/bounds
UILabel & NSAttributedString
UIButton & actions
UITextField & UITextView
Core UI Components
UIImageView & content modes
UIScrollView & contentOffset
UISwitch & UISlider
UIActivityIndicatorView
Navigation
UINavigationController★
push / pop ViewControllers
UINavigationItem & Bar Buttons
UITabBarController
Modal Presentation (.present)
Segues & Storyboard
Coordinator Pattern (intro)
UINavigationController★
push / pop ViewControllers
UINavigationItem & Bar Buttons
Navigation
UITabBarController
Modal Presentation (.present)
Segues & Storyboard
Coordinator Pattern (intro)
Table & Collection Views
UITableViewDataSource★
UITableViewDelegate
Cell Reuse & dequeueReusableCell
Custom UITableViewCell
UICollectionViewDataSource
UICollectionViewFlowLayout
Diffable Data Source★
Compositional Layout
UITableViewDataSource★
UITableViewDelegate
Cell Reuse & dequeueReusableCell
Custom UITableViewCell
Table & Collection Views
UICollectionViewDataSource
UICollectionViewFlowLayout
Diffable Data Source★
Compositional Layout
Auto Layout
NSLayoutConstraint
Layout Anchors API★
Visual Format Language
Safe Area Layout Guide
UIStackView (axis/alignment)★
Intrinsic Content Size
Content Hugging Priority
Compression Resistance
NSLayoutConstraint
Layout Anchors API★
Visual Format Language
Safe Area Layout Guide
Auto Layout
UIStackView (axis/alignment)★
Intrinsic Content Size
Content Hugging Priority
Compression Resistance
SwiftUI Fundamentals
SwiftUI Core Views
Text & Label
Image & AsyncImage
Button & Label
TextField & SecureField
Toggle & Picker
Slider & Stepper
ProgressView
GeometryReader
Text & Label
Image & AsyncImage
Button & Label
TextField & SecureField
SwiftUI Core Views
Toggle & Picker
Slider & Stepper
ProgressView
GeometryReader
SwiftUI Layout
VStack / HStack / ZStack★
Spacer & Divider
Grid & GridRow
.padding & .frame
.background & .overlay
.cornerRadius & .clipShape
.shadow & .opacity
VStack / HStack / ZStack★
Spacer & Divider
Grid & GridRow
SwiftUI Layout
.padding & .frame
.background & .overlay
.cornerRadius & .clipShape
.shadow & .opacity
State & Data Flow★
@State
@Binding
@Environment
@StateObject
@ObservedObject
@EnvironmentObject
@Observable (iOS 17+)★
@State
@Binding
@Environment
State & Data Flow★
@StateObject
@ObservedObject
@EnvironmentObject
@Observable (iOS 17+)★
SwiftUI Navigation
NavigationStack★
NavigationLink
NavigationSplitView
.sheet & .fullScreenCover
.alert & .confirmationDialog
List & ForEach★
LazyVGrid & LazyHGrid
NavigationStack★
NavigationLink
NavigationSplitView
SwiftUI Navigation
.sheet & .fullScreenCover
.alert & .confirmationDialog
List & ForEach★
LazyVGrid & LazyHGrid
Networking & APIs
URLSession★
URLRequest & URLComponents
GET / POST / PUT / DELETE
HTTP Headers & Auth Tokens
Request Body (JSON encoding)
Status Codes (2xx/4xx/5xx)
async/await URLSession.data★
Completion Handler pattern
Combine dataTaskPublisher
URLRequest & URLComponents
GET / POST / PUT / DELETE
HTTP Headers & Auth Tokens
Request Body (JSON encoding)
URLSession★
Status Codes (2xx/4xx/5xx)
async/await URLSession.data★
Completion Handler pattern
Combine dataTaskPublisher
Codable & JSON
JSONDecoder & JSONEncoder
CodingKeys enum
Custom init(from:)★
Nested Containers
keyDecodingStrategy (camelCase)
DateDecodingStrategy
Unknown keys handling
JSONDecoder & JSONEncoder
CodingKeys enum
Custom init(from:)★
Nested Containers
Codable & JSON
keyDecodingStrategy (camelCase)
DateDecodingStrategy
Unknown keys handling
Data Persistence & Sandbox
Local Storage
UserDefaults — primitives★
Storing Codable in UserDefaults
App Group UserDefaults
FileManager API
Documents Directory
Caches Directory
Temporary Directory
Property Lists (.plist)
UserDefaults — primitives★
Storing Codable in UserDefaults
App Group UserDefaults
Local Storage
FileManager API
Documents Directory
Caches Directory
Temporary Directory
Property Lists (.plist)
Developer Tools & Workflow
Git & Version Control
clone / init / add / commit
push / pull / fetch
branch / checkout / switch
merge & rebase
Pull Request Workflow★
Conflict Resolution
git stash & cherry-pick
.gitignore & .gitattributes
clone / init / add / commit
push / pull / fetch
branch / checkout / switch
merge & rebase
Git & Version Control
Pull Request Workflow★
Conflict Resolution
git stash & cherry-pick
.gitignore & .gitattributes
Xcode & Tooling
Breakpoints & LLDB
Debug Console (po, p, v)
View Hierarchy Debugger★
Memory Graph Debugger
Swift Package Manager★
CocoaPods (legacy)
Schemes & Targets
Simulator & Device Testing
Breakpoints & LLDB
Debug Console (po, p, v)
View Hierarchy Debugger★
Memory Graph Debugger
Xcode & Tooling
Swift Package Manager★
CocoaPods (legacy)
Schemes & Targets
Simulator & Device Testing
Interview Preparation Guide
🧠 Interview Deep Dive
Preparation vs. Evaluation
Code safety, core language execution mechanics, and writing stable, production-ready features under structural guidance without breaking existing baselines.
Junior / Associate Level (SDE 1 & SDE 2)
What to Prepare
- ›Value vs. Reference Types — Stack memory allocation (fast, thread-isolated) vs. Heap allocation (dynamic, runtime overhead, metadata tracking)
- ›Copy-on-Write (CoW) — Copying a value-type collection does not duplicate elements until a mutating write occurs
- ›Structural Mutability — let vs var: on value types freezes all properties; on reference types freezes only the pointer
- ›Optionals Internals — Optional is a generic enum with .none and .some(T) cases
- ›guard vs if let — guard exits early and keeps the scope clean; prefer guard for preconditions
What is Evaluated
- ›Live coding with clean guard let early-exit unwrapping to eliminate pyramid of doom
- ›Whiteboard tracing of memory mutations — identifying accidental performance degradation or structural duplication
- ›Spotting compiler warnings when modifying properties inside non-mutating struct contexts
- ›Explaining why struct mutation inside a non-mutating func is a compile error
What to Prepare
- ›Reference Counting — ARC tracks active strong pointers to heap-allocated class instances
- ›Retain Cycles — Object A holds strong→B, Object B holds strong→A, reference count never reaches zero, memory leaks
- ›weak — always var, Optional, auto-zeroing (becomes nil when target deallocates)
- ›unowned — assumes target is never nil, non-optional, causes runtime trap if target is deallocated first
- ›Closure capture lists — [weak self] avoids retention; [unowned self] saves Optional overhead but is dangerous
What is Evaluated
- ›Spotting memory leaks in code snippets with escaping closures or delegation patterns
- ›Explaining why unowned self in a slow async network call crashes when the user navigates away before the response arrives
- ›Drawing a retain cycle diagram and explaining how to break it
What to Prepare
- ›UIKit State Machine — viewDidLoad (one-time setup) vs viewWillAppear (refresh live data) vs viewDidAppear (start animations)
- ›SwiftUI Layout Pass — Parent proposes size → Child calculates required size → Parent positions child
- ›@State (local transient) vs @Binding (two-way channel to parent) vs @ObservedObject (external source of truth)
- ›UITableView cell reuse — always reset all properties in prepareForReuse to avoid stale data
- ›Auto Layout priority — content hugging vs compression resistance
What is Evaluated
- ›Building custom list rows that handle cell reuse without main-thread stutter
- ›Solving conflicting Auto Layout constraints without breaking the debug console
- ›Explaining the three-phase SwiftUI layout pass in a whiteboard session
What to Prepare
- ›URLSession.data(for:) with async/await — modern, clean networking without callbacks
- ›Codable — JSONDecoder decodes JSON to Swift structs/classes automatically with CodingKeys for custom mapping
- ›HTTP Status Codes — 2xx success, 4xx client error (401 auth, 403 forbidden, 404 not found), 5xx server error
- ›Error handling in network layer — always validate both the HTTPURLResponse status code and the decoded payload
What is Evaluated
- ›Writing a complete async/await network call with error handling from scratch in a coding interview
- ›Implementing a custom CodingKeys enum to map snake_case JSON keys to camelCase Swift properties
- ›Explaining what happens when a 401 response is received and how to handle token refresh
Click each topic to expand preparation details and interview evaluation criteria