iOS · 16 min
Senior iOS interview questions for 2026, and the follow-ups
Twelve senior iOS interview questions for 2026: what each scores, a weak and a senior answer, and the follow-up on Swift 6 concurrency, SwiftUI, architecture.
iOS · 12 min read
An Apple iOS mock interview built honestly: what Apple's careers pages publish (little), a Swift-heavy practice loop, seven practice prompts and a rubric.
An Apple iOS mock interview has an honest problem at its centre: Apple publishes almost nothing about how it interviews engineers. I read Apple’s careers pages before writing this. They describe how the company is organised and point to job search. I did not find a published description of the interview process, the number of rounds, or what is assessed. Anyone who tells you “the Apple loop is exactly this” is repeating secondhand accounts.
So this page does not pretend. It says what Apple’s pages do say, then gives you a mock loop for a senior iOS engineer that is built around the one thing you can be sure of: if you interview for an iOS role anywhere, Apple included, you will be tested on Swift, the frameworks and how you build for the platform. It has seven practice prompts with follow-ups and the rubric I use when I write up a candidate.
The prompts are practice prompts I wrote. They are generic iOS engineering problems, not questions Apple has asked. I never attribute a question to a named company, on this page or anywhere on this site.
As described on Apple’s careers pages, Apple organises around functional expertise, with experts leading experts in each area, and the pages direct candidates to job search for open roles. That is context and does not describe the interview. It may mean that the people interviewing you for an iOS role are specialists in that area, though the page does not say so.
What I could not find on Apple’s own pages:
Third-party sites describe Apple loops in detail, but I am not citing them, because I cannot verify them against anything Apple has published. The practical advice is the same as for any company: ask your recruiter for the format of your specific loop, including the number of rounds, whether any round is a take-home or a project discussion, and what the technical rounds focus on. Teams at a large company can run very different loops for the same title.
Without a published format, I built the mock from what an iOS role demands, not from rumor. That means Swift fluency, including Swift concurrency under the Swift 6 language mode, framework knowledge across SwiftUI and UIKit, performance and memory on a real device, privacy and permissions, and app-level design. It also means a conversation about past work, because every senior loop I have been part of includes one.
The mock is heavier on Swift and platform detail than the general FAANG mobile mock interview. If your recruiter describes something different, reshape the rounds to match and keep the rubric.
This is a practice shape I built, not an Apple loop. Apple publishes no round structure, so treat every row as an assumption to check with your recruiter.
| Round | Time | Format | Focus |
|---|---|---|---|
| 1. Swift coding | 45 min | Xcode or a plain document, ask your recruiter | Correct, idiomatic Swift with tests |
| 2. Swift concurrency and the platform | 45 min | Code plus discussion | Actors, cancellation, main actor, lifecycle |
| 3. App design | 60 min | Whiteboard or drawing tool | Architecture, data, background work, privacy |
| 4. Past work and judgement | 45 min | Conversation | Ownership, quality, disagreement |
If you do not know whether you will have Xcode, practise round 1 both ways. Writing Swift without the compiler exposes gaps in things like optional handling and protocol syntax that the IDE normally hides.
Write a generic cache with a fixed capacity where keys are Hashable. Reading a value marks it as most recently used; inserting past capacity evicts the least recently used entry.
Follow-ups: Why a class for the list nodes and not a struct? Where could a retain cycle appear in your linked list, and how do you avoid it? How would you make this safe to use from multiple tasks?
What a strong answer shows: a dictionary from key to node plus a doubly linked list, weak or unowned on one direction of the links with the reason stated, O(1) reads and writes, and a concurrency answer that picks an actor and accepts that every call becomes await, or picks a lock and explains why the synchronous API matters to callers.
Given a JSON payload of posts where some fields may be missing or malformed, decode it into model types so that one bad post does not fail the whole feed.
Follow-ups: Where do you report the bad posts? What if the server adds a new post type next month? How do you test this?
What a strong answer shows: Codable with a lossy wrapper or a per-element decode that collects failures, an unknown case for forward compatibility, and tests driven by JSON fixtures including a broken element.
In both prompts, I score idiomatic Swift. Value types where they fit, clear optional handling, no force unwraps without a reason said out loud. A solution that works but reads like translated Java loses points on a senior iOS bar.
Build the model behind a search screen: debounce typing, cancel stale requests, never show results for an older query, and keep the UI updates on the main actor.
Follow-ups: Under the Swift 6 language mode, what does the compiler now reject that Swift 5 mode only warned about? If the response type is not Sendable, what happens? Where exactly does cancellation reach the network call?
What a strong answer shows: a stored Task cancelled on each change, a sleep that throws on cancellation used as the debounce, a check that the result matches the current query, a @MainActor model, and a clear explanation that data-race checks become errors under Swift 6 mode. The candidate should know that URLSession’s async methods respond to task cancellation.
A photo grid shows thousands of thumbnails from the photo library. Scrolling stutters and memory climbs. Walk through how you find the cause and what you change.
Follow-ups: Which Instruments templates do you open first? Where does decoding happen today? How do you size images for the cell rather than the original?
What a strong answer shows: measuring before changing (Time Profiler for the stutter, Allocations for the growth), downsampling to the display size, decoding off the main thread, a cache sized in bytes with a response to memory warnings, and prefetching that is cancelled when cells scroll away.
This round is where a senior iOS candidate should sound like someone who has shipped. I listen for tool names, specific numbers they would look at, and the order in which they would try things.
Design a feature that backs up the user’s new photos to a server, including large videos, without the user keeping the app open.
Follow-ups: What happens when the app is suspended or terminated mid-upload? How do you avoid uploading the same file twice? What permissions do you need, and what happens if the user grants only limited library access?
What a strong answer shows: a background URLSession configuration for large transfers that continue while the app is suspended, a persisted queue of pending uploads with stable identifiers for idempotency, handling of the limited photo library access case, and a clear stance on battery and cellular data. The privacy follow-up should be answered as a product decision as well as an API one.
The app is mostly UIKit. A new settings area will be built in SwiftUI and must share state with existing UIKit screens. Design the state flow.
Follow-ups: Where does the state live? How does a UIKit screen observe a change made in SwiftUI? How would you migrate the rest over time without a rewrite?
What a strong answer shows: a single observable model owned outside both view layers, UIHostingController at the boundary, observation from UIKit through a published stream or the observation framework, and an incremental migration plan screen by screen with a rule for new work.
Design answers on an iOS loop should stay close to the device. Server architecture is fine to mention. The interviewer wants to hear about what the app does when the network, the OS or the user does something inconvenient.
Tell me about a time you pushed back on shipping something because the quality was not there. What happened?
Follow-ups: Who wanted to ship, and why? What evidence did you bring? If you were overruled, what did you do? Would you make the same call today?
What a strong answer shows: a specific feature, a specific quality problem with evidence (a crash rate, a performance number, an accessibility failure), the conversation that followed, and the result. Candidates who were overruled and handled it well often give the best answers here.
I write down whether the story would be different if the candidate had not been there. If it would not, the story is about the team, not about them.
Score each round from 1 to 4 on these rows, with one line of evidence each.
| Signal | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| Swift fluency | Fights the syntax | Correct but unidiomatic | Idiomatic, value types, clean optionals | Uses the type system to prevent bugs |
| Concurrency | Threads and hope | Knows async/await syntax | Isolation, cancellation, Sendable explained | Predicts what the compiler will reject and why |
| Platform depth | Generic answers | Names frameworks | Lifecycle, memory, background limits unprompted | Measures first, then changes, with tool names |
| Design | Boxes without decisions | Decisions without reasons | Decisions with costs | Plans for termination, old versions and privacy |
| Testing | None | Mentions tests | Writes or describes specific cases | Designs code so it is easy to test |
| Ownership | “We” throughout | Own tasks | Own decisions and why | Outcomes that would not exist without them |
For a senior iOS bar, look for 3s everywhere with at least one 4 in platform depth or concurrency. A 1 anywhere is the next thing to fix.
The replay usually shows the same thing: the candidate knew the answer and did not say the reason. The reason is what gets scored.
@MainActor written on every type.@concurrent attribute marks a function that should run concurrently, which makes it visible in the code when work leaves the actor.The Apple careers pages were read on 24 September 2026 and did not describe the interview process. If Apple publishes one later, it replaces everything in the section about what Apple publishes.
Run the whole loop once before you change anything, so you have an honest baseline. Then fix one row at a time.

iOS · 16 min
Twelve senior iOS interview questions for 2026: what each scores, a weak and a senior answer, and the follow-up on Swift 6 concurrency, SwiftUI, architecture.

iOS · 12 min
What an iOS coding interview asks: the practical tasks that recur, the algorithm round in Swift, and what is graded beyond whether it compiles.

Mobile system design · 15 min
What an iOS design round adds: background limits, background URLSession, storage, image pipelines and push, with a worked photo feed design.