Domande colloquio sviluppatore iOS junior: Swift, UIKit e SwiftUI

Milad Bonakdar
Autore
Esercitati con domande da colloquio iOS junior su Swift, UIKit, SwiftUI, networking, persistenza e codice asincrono, con risposte pratiche.
Introduzione
In un colloquio per sviluppatore iOS junior, di solito vogliono capire se sai spiegare le basi di Swift, creare UI semplici con UIKit o SwiftUI, recuperare e decodificare dati, scegliere una persistenza adatta ed evitare errori comuni di memoria o threading. Le risposte migliori sono brevi, concrete e collegate a come costruiresti una piccola app.
Usa questa guida per esercitarti sulle domande più probabili per un ruolo iOS entry-level: cosa significa il concetto, quando lo useresti e quale rischio dovrebbe controllare uno sviluppatore junior.
Fondamenti di Swift (6 Domande)
1. Qual è la differenza tra var e let in Swift?
Risposta:
var: Dichiara una variabile mutabile. Il suo valore può essere modificato dopo l'inizializzazione.let: Dichiara una costante immutabile. Una volta impostato, il suo valore non può essere modificato.- Best Practice: Usa
letdi default per sicurezza e chiarezza. Usavarsolo quando sai che il valore cambierà.
Rarità: Molto Comune Difficoltà: Facile
2. Spiega gli Optional in Swift. Cos'è l'Optional Binding?
Risposta:
Gli Optional rappresentano un valore che potrebbe essere nil (assenza di un valore).
- Dichiarazione: Usa
?dopo il tipo:var name: String? - Metodi di Unwrapping:
- Force Unwrapping:
name!(pericoloso, crasha se nil) - Optional Binding: Unwrapping sicuro usando
if letoguard let - Nil Coalescing:
name ?? "Default" - Optional Chaining:
user?.address?.city
- Force Unwrapping:
Rarità: Molto Comune Difficoltà: Facile
3. Qual è la differenza tra una class e una struct in Swift?
Risposta:
- Class: Tipo di riferimento (memorizzato nell'heap). Supporta l'ereditarietà. Passato per riferimento.
- Struct: Tipo di valore (memorizzato nello stack). Nessuna ereditarietà. Passato per copia.
- Quando usare:
- Struct: Per modelli di dati semplici, quando si desidera una semantica di valore (copie indipendenti)
- Class: Quando è necessaria l'ereditarietà, la semantica di riferimento o i deinitializer
Rarità: Molto Comune Difficoltà: Media
4. Cosa sono le Closure in Swift?
Risposta: Le Closure sono blocchi di funzionalità autonomi che possono essere passati e utilizzati nel tuo codice. Sono simili alle lambda o alle funzioni anonime in altri linguaggi.
- Sintassi:
{ (parametri) -> ReturnType in statements } - Cattura di Valori: Le Closure possono catturare e memorizzare riferimenti a variabili dal loro contesto circostante.
- Uso Comune: Completion handler, callback, operazioni su array.
Rarità: Molto Comune Difficoltà: Media
5. Spiega la differenza tra riferimenti weak e unowned.
Risposta: Entrambi vengono utilizzati per prevenire cicli di ritenzione (perdite di memoria) nei tipi di riferimento.
weak: Riferimento opzionale che diventa automaticamentenilquando l'oggetto a cui si fa riferimento viene deallocato. Usare quando il riferimento potrebbe sopravvivere all'oggetto.unowned: Riferimento non opzionale che presuppone che l'oggetto esisterà sempre. Si arresta in modo anomalo se vi si accede dopo la deallocazione. Usare quando si è certi che il riferimento non sopravviverà all'oggetto.
Rarità: Comune Difficoltà: Media
6. Cosa sono i Protocolli in Swift?
Risposta: I Protocolli definiscono un blueprint di metodi, proprietà e altri requisiti adatti a un particolare compito o funzionalità. Classi, struct ed enum possono adottare protocolli.
- Simile a: Interfacce in altri linguaggi
- Estensioni di Protocollo: Possono fornire implementazioni predefinite
- Programmazione Orientata al Protocollo: Paradigma preferito di Swift
Rarità: Molto Comune Difficoltà: Facile
Basi di UIKit (5 Domande)
7. Qual è la differenza tra UIView e UIViewController?
Risposta:
UIView: Rappresenta un'area rettangolare sullo schermo. Gestisce il disegno e la gestione degli eventi. Esempi:UILabel,UIButton,UIImageView.UIViewController: Gestisce una gerarchia di viste. Gestisce il ciclo di vita della vista, le interazioni dell'utente e la navigazione. Contiene una vista radice e gestisce le sue sottoviste.- Relazione: Un view controller gestisce le viste. Un view controller può avere molte viste.
Rarità: Molto Comune Difficoltà: Facile
8. Spiega i metodi del ciclo di vita di un View Controller.
Risposta: I view controller hanno metodi specifici del ciclo di vita chiamati in ordine:
viewDidLoad(): Chiamato una volta quando la vista viene caricata in memoria. Impostazioni che devono avvenire una sola volta.viewWillAppear(_:): Chiamato prima che la vista appaia sullo schermo. Può essere chiamato più volte.viewDidAppear(_:): Chiamato dopo che la vista appare sullo schermo. Avvia le animazioni qui.viewWillDisappear(_:): Chiamato prima che la vista scompaia.viewDidDisappear(_:): Chiamato dopo che la vista scompare. Pulisci le risorse.
Rarità: Molto Comune Difficoltà: Facile
9. Cos'è Auto Layout e come si usano i vincoli (constraints)?
Risposta: Auto Layout è un sistema di layout basato su vincoli che ti consente di creare interfacce utente adattive che funzionano su diverse dimensioni dello schermo e orientamenti.
- Vincoli (Constraints): Definiscono le relazioni tra le viste (larghezza, altezza, spaziatura, allineamento)
- Metodi:
- Interface Builder: Editor visuale in Xcode
- Programmatico: API NSLayoutConstraint o NSLayoutAnchor
- Visual Format Language: Basato su stringhe (meno comune ora)
Rarità: Molto Comune Difficoltà: Media
10. Qual è la differenza tra frame e bounds?
Risposta:
frame: La posizione e le dimensioni della vista nel sistema di coordinate della sua supervista. Usato per posizionare la vista.bounds: La posizione e le dimensioni della vista nel suo proprio sistema di coordinate. L'origine è solitamente (0, 0). Usato per disegnare il contenuto all'interno della vista.- Differenza Chiave:
frameè relativo al genitore,boundsè relativo a se stesso.
Rarità: Comune Difficoltà: Media
11. Come gestisci l'input utente da un UITextField?
Risposta: Esistono diversi approcci:
- Target-Action: Aggiungi target per l'evento
.editingChanged - Delegate: Conformarsi al protocollo
UITextFieldDelegate - Combine: Usa i publisher (approccio moderno)
Rarità: Molto Comune Difficoltà: Facile
Basi di SwiftUI (4 Domande)
12. Che cos’è SwiftUI e in cosa è diverso da UIKit?
Risposta:
SwiftUI è il framework dichiarativo di Apple per creare interfacce. Descrivi la UI come funzione dello stato, e SwiftUI aggiorna la vista quando quello stato cambia. UIKit è imperativo: crei e modifichi direttamente oggetti come UIView, UILabel e UIViewController.
In un colloquio junior, non presentarlo come se SwiftUI sostituisse UIKit ovunque. Molte app in produzione usano entrambi. Una buona risposta: SwiftUI è conciso per nuove schermate e UI basate sullo stato; UIKit resta importante per codebase esistenti, controlli personalizzati e API non ancora coperte completamente da SwiftUI.
Rarità: Molto Comune Difficoltà: Facile
13. Spiega @State, @Binding e @ObservedObject in SwiftUI.
Risposta: Questi wrapper indicano dove vive lo stato e chi può modificarlo.
@State: Stato privato posseduto da una vista, di solito per stato locale della UI.@Binding: Connessione bidirezionale verso stato posseduto da una vista padre. La vista figlia può leggerlo e modificarlo senza possederlo.@ObservedObject: Riferimento a dati osservabili esterni. Si usa quando un altro oggetto possiede i dati e la vista deve aggiornarsi quando cambiano. Nel codice SwiftUI più recente puoi vedere anche il framework Observation e@Observable, anche se molti colloqui chiedono ancora questi wrapper.
Rarità: Comune Difficoltà: Media
14. Come crei una lista in SwiftUI?
Risposta:
Usa la vista List per visualizzare raccolte scorrevoli di dati.
Rarità: Comune Difficoltà: Facile
15. Cosa sono i View Modifiers in SwiftUI?
Risposta: I modificatori di vista sono metodi che creano una nuova vista con proprietà modificate. Sono concatenabili.
- Modificatori Comuni:
.padding(),.background(),.foregroundColor(),.font(),.frame() - L'Ordine Conta: I modificatori vengono applicati in sequenza
Rarità: Comune Difficoltà: Facile
Dati e Networking (5 Domande)
16. Come esegui una richiesta di rete in iOS?
Risposta:
Usa URLSession. In Swift moderno, una risposta junior può mostrare async/await e ricordare che codebase più vecchie usano ancora completion handler. Una risposta più solida valida anche la risposta HTTP, gestisce gli errori, decodifica modelli Codable e aggiorna la UI sul main actor.
Rarità: Molto Comune Difficoltà: Media
17. Cos'è Codable in Swift?
Risposta:
Codable è un alias di tipo per i protocolli Encodable & Decodable. Consente una facile conversione tra tipi Swift e rappresentazioni esterne come JSON.
- Sintesi Automatica: Swift genera automaticamente il codice di codifica/decodifica se tutte le proprietà sono Codable.
- Chiavi Personalizzate: Usa l'enum
CodingKeysper mappare nomi di proprietà diversi.
Rarità: Molto Comune Difficoltà: Facile
18. Come rendi persistenti i dati localmente in iOS?
Risposta: Molteplici opzioni per la persistenza dei dati locale:
- UserDefaults: Semplice storage chiave-valore per piccole quantità di dati (impostazioni, preferenze)
- File System: Salva i file nella directory Documents o Cache
- Core Data: Framework di Apple per la gestione e la persistenza del grafo di oggetti
- SQLite: Database relazionale
- Keychain: Storage sicuro per dati sensibili (password, token)
Rarità: Molto Comune Difficoltà: Facile
19. Qual è la differenza tra operazioni sincrone e asincrone?
Risposta:
Un’operazione sincrona blocca il thread corrente finché non termina. Sul main thread è pericolosa perché l’app può smettere di rispondere. Un’operazione asincrona avvia il lavoro e lascia continuare il thread; il risultato arriva dopo tramite async/await, un completion handler, un delegate o un publisher.
Nei colloqui iOS, collega la risposta alla reattività della UI: chiamate di rete, lavoro su file e calcoli pesanti non devono bloccare il main thread, e le modifiche alla UI devono essere eseguite sul main actor.
Rarità: Comune Difficoltà: Facile
20. Che cos’è Grand Central Dispatch (GCD)?
Risposta: GCD è l’API di basso livello di Apple per schedulare lavoro su dispatch queue. La main queue si usa per la UI, mentre le global queue possono eseguire lavoro in background con diverse priorità di quality of service.
In Swift moderno, spesso userai prima Swift concurrency (async/await, Task e actors), perché rende il codice asincrono più leggibile. GCD resta importante perché molti progetti UIKit, codebase più vecchie e API con callback usano DispatchQueue.main.async o code in background.
Rarità: Comune Difficoltà: Media


