iosNudge

3 months

3 Month Plan

This plan is for you if you want to prepare fully, or if you are new to iOS interviews. It goes through every question and every guide on the site in 12 weeks. Each week builds on the one before.

12 parts157 items 29h 59m in total1–2 hours a day
0/157 completed0%

Week 1 — Start here and Swift basics

0/16 done

Week 2 — Closures, protocols and generics

0/14 done
  • An escaping closure can be called after the function that received it returns, so it must be marked @escaping and you must think about what it captures.

    QuizEasy2 mins
  • A capture list, like [weak self] or [count], controls how a closure captures values, either by making references weak or by copying a value at creation time.

    QuizMedium3 mins
  • A key path like \User.name is a type-safe reference to a property that you can store, pass around and use later to read or write that property.

    QuizMedium2 mins
  • Protocol-oriented programming means building behavior from small protocols with default implementations, instead of deep class inheritance.

    QuizMedium2 mins
  • Equatable gives ==, Hashable lets a type be a Set element or Dictionary key, and Comparable gives <; Swift writes them for you when all stored properties already conform.

    QuizEasy2 mins
  • Generics let you write one function or type that works with many types, and constraints limit those types to ones that have the abilities you need.

    QuizMedium2 mins
  • An associated type is a placeholder type inside a protocol that each conforming type fills in with a real type.

    QuizMedium2 mins
  • some is an opaque type that stands for one specific concrete type the compiler knows; any is a box that can hold any conforming type at run time.

    QuizMedium3 mins
  • Swift uses static dispatch when it knows the exact method, table dispatch for class overrides and protocol requirements, and message dispatch for @objc dynamic.

    QuizHard3 mins
  • Swift has no built-in stack, queue, deque or heap. Here is how to write each one quickly, plus linked lists, tree nodes and graph adjacency lists.

    GuideEasy3 mins
  • Parse version strings like "2.0.0-beta.1" and sort them correctly with Comparable, following the semver rules.

    Swift codingMedium25 mins11 tests
  • Write a generic memoize function that caches results, plus a version that also works for recursive functions like Fibonacci.

    Swift codingEasy15 mins10 tests
  • Group words made of the same letters by using a dictionary with a smart key.

    Swift codingMedium20 mins9 tests
  • For each index, multiply every other number, without division, using prefix and suffix products.

    Swift codingMedium20 mins8 tests

Week 3 — Advanced Swift and memory

0/13 done
  • Swift has six levels, open, public, package, internal, fileprivate and private, that control who can see and use a declaration.

    QuizEasy2 mins
  • A property wrapper is a type that wraps the get and set logic of a property so you can reuse it with an @Attribute, like @State or @Published.

    QuizMedium2 mins
  • A result builder is a type marked @resultBuilder that turns a list of statements in a closure into one combined value, which is how SwiftUI's @ViewBuilder works.

    QuizHard2 mins
  • Swift macros generate code at compile time from your source, using either a freestanding

    QuizHard3 mins
  • ARC counts strong references to each class instance and frees the instance as soon as the count reaches zero, with retain and release calls inserted by the compiler.

    QuizMedium3 mins
  • The stack is fast, per-thread memory freed automatically when a function returns, while the heap is shared memory for data that must outlive a function, like class instances, managed by ARC.

    QuizMedium3 mins
  • A strong reference keeps an object alive, a weak reference does not and becomes nil when the object dies, and an unowned reference does not and crashes if used after the object dies.

    QuizEasy3 mins
  • A retain cycle happens when objects hold strong references to each other so their counts never reach zero; you break it by making one link weak or unowned.

    QuizMedium2 mins
  • Check that deinit runs, use Xcode's Memory Graph Debugger to see who holds an object, use the Leaks and Allocations instruments, and add tests that assert objects are freed.

    QuizMedium3 mins
  • Write a @Clamped property wrapper that keeps a value inside a range, like a volume from 0 to 100.

    Swift codingEasy15 mins9 tests
  • Build a generic cache that drops the least recently used item when it is full. Every operation must be O(1).

    Swift codingMedium30 mins10 tests
  • Build an NSCache-like cache with a total cost limit that evicts the least recently used items until it fits.

    Swift codingMedium30 mins10 tests
  • Reverse a singly linked list in place by turning every next pointer around.

    Swift codingEasy15 mins8 tests

Week 4 — Concurrency: GCD and async/await

0/13 done
  • GCD is a lightweight C-based API for running closures on queues, while OperationQueue is a higher-level Objective-C API built on GCD that adds dependencies, cancellation and concurrency limits.

    QuizMedium2 mins
  • A serial queue runs one task at a time in order while a concurrent queue can run many at once, and sync waits for the work to finish while async returns immediately.

    QuizEasy2 mins
  • A deadlock is when threads wait for each other forever, a data race is unsynchronized access to the same memory with at least one write, and a race condition is a logic bug that depends on timing.

    QuizMedium3 mins
  • Protect shared mutable state with an actor, a lock or Mutex, a serial queue, or atomics, or avoid sharing it by using immutable value types and main-actor isolation.

    QuizMedium3 mins
  • An async function can pause at each await without blocking its thread, letting Swift run other work on that thread until the result is ready.

    QuizMedium2 mins
  • A continuation suspends an async function until a callback calls resume exactly once, which lets you wrap completion-handler APIs as async functions.

    QuizMedium2 mins
  • A task group runs a dynamic number of child tasks in parallel and collects their results, while async let is for a fixed, small number of tasks known at compile time.

    QuizMedium3 mins
  • Cancellation in Swift is cooperative; cancel() only sets a flag, and your code must check Task.isCancelled or call try Task.checkCancellation() to stop.

    QuizMedium2 mins
  • Run an action only after the calls stop for a short time, like a search box that waits until the user stops typing.

    Swift codingMedium25 mins9 tests
  • Run an action at most once per time window. The first call runs right away, and the last call in the window runs when the window ends.

    Swift codingMedium25 mins9 tests
  • Retry a failing async operation, and double the wait time after each failure.

    Swift codingMedium20 mins8 tests
  • Transform an array with async work in parallel, keep the input order, and never run more than N tasks at once.

    Swift codingHard35 mins8 tests
  • How to write an iOS resume that gets interviews, with impact bullets, good and bad examples, links and ATS tips.

    GuideEasy6 mins

Week 5 — Concurrency: actors and Swift 6

0/12 done
  • An actor is a reference type that protects its mutable state by running only one task at a time on it, and reentrancy means its state can change while one of its methods is suspended at an await.

    QuizMedium2 mins
  • @MainActor is a global actor that runs code on the main thread, and marking UI types and methods with it lets the compiler check that UI updates happen there.

    QuizMedium2 mins
  • Sendable marks types whose values can safely cross between concurrency domains, like tasks and actors, without causing data races.

    QuizHard3 mins
  • The Swift 6 language mode turns data-race checks into compile errors, so shared mutable state must be isolated to an actor or be Sendable; you migrate module by module, starting with warnings.

    QuizHard3 mins
  • AsyncStream turns callback, delegate or notification APIs that produce many values over time into an AsyncSequence you can loop over with for await.

    QuizMedium2 mins
  • Combine is Apple's reactive framework where publishers emit values over time, operators transform them, and subscribers receive them, with AnyCancellable controlling how long a subscription lives.

    QuizMedium2 mins
  • Build a bank account as an actor so many tasks can deposit, withdraw and transfer at the same time without data races.

    Swift codingEasy15 mins10 tests
  • Build a typed publish/subscribe bus where a subscription ends by itself when its token is released.

    Swift codingMedium25 mins10 tests
  • When to use two pointers, sliding window, hashing, binary search and prefix sums, with a short Swift template for each.

    GuideEasy3 mins
  • Find the longest run of unique characters with a sliding window and a dictionary.

    Swift codingMedium20 mins10 tests
  • Merge overlapping calendar events into busy blocks by sorting first, then scanning once.

    Swift codingMedium20 mins9 tests
  • Use binary search to find the first broken CI build with as few checks as possible.

    Swift codingEasy15 mins8 tests

Week 6 — UIKit

0/13 done

Week 7 — SwiftUI

0/12 done
  • The @State wrapper owns data inside a view, @Binding gives a child read-write access to someone else's data, @Bindable makes bindings to an @Observable object, and @Environment reads shared values from above.

    QuizMedium2 mins
  • The @Observable macro makes a class track reads and writes of each property, so SwiftUI only updates views that read the changed property, while ObservableObject updates every observer on any change.

    QuizMedium2 mins
  • SwiftUI uses identity to decide if a view is the same one as before, and identity controls how long state lives and whether changes animate or reset.

    QuizHard2 mins
  • A SwiftUI view struct is created and thrown away often, but its state lives as long as its identity, and onAppear, onDisappear and task tie work to when it is shown.

    QuizMedium2 mins
  • NavigationStack drives navigation from data, so you push by appending values to a path and map each value type to a screen with navigationDestination.

    QuizMedium2 mins
  • Keep body cheap, make each view depend on as little data as possible, keep identities stable, use lazy containers, and measure with the SwiftUI instrument.

    QuizHard2 mins
  • Wrap UIKit views with UIViewRepresentable or UIViewControllerRepresentable, and host SwiftUI inside UIKit with UIHostingController or UIHostingConfiguration.

    QuizMedium2 mins
  • How to build a screen live or as a take-home project, with a clean structure, MVVM, networking, tests and a README that reviewers like.

    GuideEasy5 mins
  • Build a 1–5 star control that shows half stars, reacts to taps, and works with VoiceOver.

    SwiftUIEasy30 mins
  • Build an email and password form with live validation, a loading state, server errors and good keyboard focus.

    SwiftUIMedium40 mins
  • Build a start, pause and reset countdown that stays correct when the app goes to the background.

    SwiftUIMedium40 mins
  • Build a search screen that waits 300 ms after typing, cancels old requests, and shows results, empty and error states.

    SwiftUIMedium40 mins

Week 8 — Architecture, trees and graphs

0/13 done
  • MVC is simple but leads to huge view controllers, MVVM moves logic into a testable view model, VIPER splits a screen into many small roles, and TCA uses one state, actions and a reducer.

    QuizMedium3 mins
  • A coordinator owns navigation, so view controllers do not know about each other and screens become reusable and easy to test.

    QuizMedium2 mins
  • Dependency injection means an object gets its dependencies from outside instead of creating them, which makes code easy to test and change.

    QuizMedium2 mins
  • A singleton gives one shared instance through a global access point, which is convenient but hides dependencies, shares mutable state and makes testing hard.

    QuizEasy2 mins
  • Split the app into local Swift packages with clear layers, like core, features and interfaces, so builds are faster, boundaries are enforced and teams can work in parallel.

    QuizHard2 mins
  • Build a small DI container that registers factories by type, supports singleton and transient scopes, and throws for missing types.

    Swift codingMedium25 mins11 tests
  • Parse custom-scheme deep links and universal links into a type-safe Route enum with URLComponents.

    Swift codingMedium25 mins12 tests
  • Find a build order for Swift modules from their dependencies with a topological sort, and detect cycles.

    Swift codingHard35 mins11 tests
  • DFS and BFS on trees, graphs and grids (recursive and iterative), topological sort and union-find, as Swift templates.

    GuideEasy3 mins
  • Count connected regions of filled pixels in a mask with flood fill (the "number of islands" problem).

    Swift codingMedium20 mins9 tests
  • Build a prefix tree that returns sorted search suggestions without scanning every word.

    Swift codingMedium25 mins10 tests
  • Build a generic binary heap with push, pop and peek in O(log n), ordered by any comparator.

    Swift codingMedium30 mins10 tests
  • Count how often each hashtag is used and return the k most popular ones.

    Swift codingMedium20 mins9 tests

Week 9 — Networking and persistence

0/14 done
  • Build a URLRequest, call try await session.data(for:), check the HTTP status code, then decode the data, and choose a session configuration for caching, timeouts or background transfers.

    QuizEasy2 mins
  • Codable lets the compiler generate encoding and decoding code, and you customize it with CodingKeys, decoder strategies or a hand-written init(from:).

    QuizEasy1 mins
  • Let URLCache handle HTTP caching with Cache-Control and ETag headers, and add your own memory and disk cache for decoded, downsampled images.

    QuizMedium2 mins
  • REST uses many resource URLs and is simple to cache, GraphQL uses one endpoint where the client picks the fields it needs, and WebSockets keep a two-way connection open for real-time data.

    QuizMedium2 mins
  • Use UserDefaults for small settings, the Keychain for secrets, files for documents and caches, and SwiftData, Core Data or SQLite for structured data you query.

    QuizEasy3 mins
  • Each managed object context belongs to one queue, so you work inside perform, use the view context only on the main thread, and pass NSManagedObjectID values between contexts instead of objects.

    QuizHard2 mins
  • SwiftData is Apple's Swift-first persistence framework where you mark classes with @Model, read them with @Query and save through a ModelContext, built on Core Data's proven storage.

    QuizMedium2 mins
  • Decode a real-looking API response with snake_case keys, ISO 8601 dates, nested and optional fields, and an enum that survives new values.

    Swift codingMedium25 mins11 tests
  • Build an actor that loads pages for an infinite list, ignores duplicate loads while one is running, and stops at the last page.

    Swift codingHard35 mins9 tests
  • Turn a date into "just now", "5m ago", "2h ago", "yesterday", "3d ago" or a short date, with the current time injected for testing.

    Swift codingEasy15 mins10 tests
  • Build a list that loads the next page before the user reaches the end, with loading, error and empty states.

    SwiftUIMedium45 mins
  • Build a Kingfisher-style library with a memory and disk cache, shared in-flight requests, downsampling, and safe cancellation in reused cells.

    System designHard1h
  • Recursion and backtracking in Swift, memoization with dictionaries and arrays, bottom-up tables, and the common DP shapes with templates.

    GuideEasy4 mins
  • Rotate an n x n pixel grid 90 degrees clockwise in place, with a transpose and a mirror.

    Swift codingMedium20 mins8 tests

Week 10 — Platform, testing and system design basics

0/13 done
  • An app moves between not running, inactive, active, background and suspended states, with AppDelegate handling process-level events and SceneDelegate handling each window's UI lifecycle.

    QuizEasy2 mins
  • iOS suspends apps quickly, so you use beginBackgroundTask for short finishing work, BGTaskScheduler for deferred tasks, background URLSession for transfers, and special background modes for audio, location or VoIP.

    QuizMedium2 mins
  • The app asks for permission, registers with APNs to get a device token, sends the token to its server, and the server sends a JSON payload to APNs, which delivers it to the device.

    QuizMedium2 mins
  • Universal links are normal https links that open your app when a verified apple-app-site-association file on your domain lists it, while custom URL schemes are unverified and any app can claim them.

    QuizMedium2 mins
  • Give every element a clear label, value and trait for VoiceOver, support Dynamic Type, keep good contrast and large tap targets, respect Reduce Motion, and test with VoiceOver and Accessibility Inspector.

    QuizEasy2 mins
  • Swift Testing uses @Test functions with expect and require macros, parameterized tests and parallel runs by default, while XCTest uses XCTestCase subclasses and XCTAssert functions, and both can live in the same target.

    QuizEasy2 mins
  • Hide each dependency behind a protocol or closure, inject it, and in tests pass a test double such as a stub that returns fixed data or a spy that records calls.

    QuizMedium2 mins
  • XCUITest drives the app from a separate process through accessibility, so you find elements by accessibility identifiers, wait for them instead of sleeping, and control app state with launch arguments.

    QuizMedium2 mins
  • A step-by-step method to solve DSA problems in Swift live, plus the Swift gotchas that slow people down.

    GuideEasy6 mins
  • How iOS trivia rounds work, how to answer with definition, example and trade-off, and a checklist of the top topics.

    GuideEasy7 mins
  • A short overview of mobile system design rounds and a simple framework to structure your answer.

    GuideEasy6 mins
  • What a mobile system design round is, what interviewers check, and how it is different from a backend design round.

    GuideEasy4 mins
  • A step-by-step plan for the round, with time boxes, what to say at each step, and a worked example.

    GuideEasy5 mins

Week 11 — Performance, security, tooling and design

0/13 done
  • Measure cold launch with Instruments, XCTest metrics and the Xcode Organizer, then cut pre-main work like dynamic frameworks and static initializers and defer everything not needed for the first frame.

    QuizHard3 mins
  • Stutters are hitches where a frame misses its deadline, usually from main thread work in cell setup, image decoding, layout or offscreen rendering, so you measure with Instruments and move or remove that work.

    QuizMedium2 mins
  • Use Time Profiler for slow code, Allocations and Leaks for memory, Animation Hitches for stutters, the SwiftUI and Swift Concurrency instruments for those frameworks, and signposts to mark your own code.

    QuizMedium3 mins
  • Do less work and do it at better times, by batching network calls, using low location accuracy, avoiding timers and polling, letting the system schedule background work, and measuring with the energy tools.

    QuizMedium2 mins
  • Store small secrets like tokens in the Keychain with the right accessibility class, protect files with Data Protection, and use the Secure Enclave and biometrics for the most sensitive keys.

    QuizMedium2 mins
  • ATS forces secure HTTPS connections by default, and pinning goes further by only trusting specific server keys, which you set with NSPinnedDomains in Info.plist or check yourself in a URLSession delegate.

    QuizHard2 mins
  • A certificate proves who signed the app, the provisioning profile says which app, devices and entitlements that certificate may use, and iOS refuses to run code whose signature or profile does not match.

    QuizMedium3 mins
  • A target is what you build, a build configuration is a set of build settings like Debug or Release, and a scheme says which targets and configurations to use when you run, test, profile or archive.

    QuizEasy3 mins
  • Run build, lint and tests on every pull request on a macOS runner, and on main or a tag archive a signed build, bump the build number and upload it to TestFlight automatically.

    QuizMedium2 mins
  • How to turn a vague prompt into a clear scope. Functional and non-functional needs for mobile, and the questions worth asking.

    GuideEasy4 mins
  • How to split an app into layers and modules, how dependency injection works, and how to show it with a diagram and Swift protocols.

    GuideEasy4 mins
  • Network models vs app models, where to store data on iOS, how the app talks to the server, cursor vs offset pagination, and API contracts.

    GuideEasy4 mins
  • Design a typed, testable networking layer with endpoints, a middleware chain, single-flight token refresh, safe retries and clear errors.

    System designMedium45 mins

Week 12 — System design practice and final prep

0/11 done
  • Caching, offline sync, real-time updates, images, background work, concurrency and errors, with Swift for each.

    GuideEasy5 mins
  • Launch time, smooth scrolling, memory and battery, plus logs, metrics, crash reports, feature flags and gradual rollout.

    GuideEasy5 mins
  • What weak mobile system design answers look like, and a better version of each one.

    GuideEasy6 mins
  • Design a social feed with cursor pagination, prefetching, optimistic likes and an offline cache that opens instantly.

    System designMedium45 mins
  • Design 1:1 and group chat with a WebSocket, server-side ordering, delivery states, an offline outbox and push notifications.

    System designHard1h
  • Design a notes app that works fully offline and syncs across devices with a local database, a push/pull sync engine and safe conflict resolution.

    System designHard1h
  • Design a tiny, crash-safe analytics SDK that many apps embed, with batching, disk persistence, retries with backoff, and privacy controls.

    System designMedium45 mins
  • Design a Netflix-style iOS client with HLS playback, resume position across devices, offline downloads and background download sessions.

    System designHard1h
  • Design an Uber-style rider app with a live driver on the map, a trip state machine that survives app kills, and battery-aware location.

    System designHard1h
  • How to answer "Tell me about a time…" questions with the STAR method, with 10 common questions and short sample answers from iOS work.

    GuideEasy9 mins
  • How to compare iOS job offers, understand levels, and negotiate politely, with sample email lines.

    GuideEasy7 mins