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
Control Flow
if / else if / else
switch & Pattern Matching
guard Statement
Ternary Operator
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
Optionals
if let binding
guard let binding
Multiple Bindings
Nil Coalescing ??
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)
Enumerations
Raw Values (String, Int)
Associated Values
CaseIterable
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:)
Protocols, Generics & Extensions
Protocols
Protocol Conformance
Protocol Inheritance
Delegation Pattern
Equatable & Comparable
Hashable & Identifiable
Codable / Encodable / Decodable
CustomStringConvertible
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()
UIKit Essentials
ViewController Lifecycle
loadView()
viewDidLoad()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
viewWillAppear()
viewDidAppear()
viewWillDisappear()
viewDidDisappear()
Core UI Components
UIView & frame/bounds
UILabel & NSAttributedString
UIButton & actions
UITextField & UITextView
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)
Table & Collection Views
UITableViewDataSource
UITableViewDelegate
Cell Reuse & dequeueReusableCell
Custom UITableViewCell
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
SwiftUI Fundamentals
SwiftUI Core Views
Text & Label
Image & AsyncImage
Button & Label
TextField & SecureField
Toggle & Picker
Slider & Stepper
ProgressView
GeometryReader
SwiftUI Layout
VStack / HStack / ZStack
Spacer & Divider
Grid & GridRow
.padding & .frame
.background & .overlay
.cornerRadius & .clipShape
.shadow & .opacity
State & Data Flow
@State
@Binding
@Environment
@StateObject
@ObservedObject
@EnvironmentObject
@Observable (iOS 17+)
SwiftUI Navigation
NavigationStack
NavigationLink
NavigationSplitView
.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
Codable & JSON
JSONDecoder & JSONEncoder
CodingKeys enum
Custom init(from:)
Nested Containers
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)
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
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
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