Questions d'entretien Swift/iOS
1. Expliquez la différence entre struct et class en Swift.
Les struct sont des types valeur (copies à l'assignation, stockées sur la pile). Les class sont des types référence (partagent la même instance via pointeur, stockées sur le tas). En Swift, les structs supportent les méthodes, les protocoles, les extensions et les propriétés calculées. Apple recommande les struct par défaut pour leurs avantages : immutabilité, thread safety, performances. Utilisez les classes quand vous avez besoin d'héritage, de référence partagee ou de deinit.
2. Qu'est-ce que l'ARC et comment prévenir les cycles de retention ?
ARC (Automatic Référence Counting) gere automatiquement la mémoire en comptant les références vers chaque objet. Quand le compteur tombe a zéro, l'objet est desalloue. Un cycle de retention se produit quand deux objets se referencent mutuellement (A -> B -> A), empechant la desallocation. Solutions : weak (référence faible, devient nil quand l'objet est desalloue) pour les relations optionnelles, unowned (référence non-proprietaire, crash si accède après desallocation) pour les relations garanties.
3. Expliquez les optionnels en Swift et les patterns d'unwrapping.
Les optionnels (Type?) representent une valeur qui peut être absente (nil). Patterns d'unwrapping : if let (optional binding conditionnel), guard let (sortie anticipee si nil), nil coalescing (??, valeur par défaut), optional chaining (?., accès securise en chaîne), force unwrapping (!, crash si nil — à éviter). Depuis Swift 5.7, la syntaxe simplifiée "if let variable" (sans le = variable) est recommandee.
4. Comment fonctionne SwiftUI et quelles sont ses différences avec UIKit ?
SwiftUI est le framework déclaratif d'Apple pour construire des interfaces. Vous décrivez ce que l'interface doit afficher, pas comment la construire. Le framework gere les mises à jour automatiquement via le binding de données. UIKit est le framework impératif traditionnel (storyboards, XIBs, code). Différences : SwiftUI est multiplateforme (iOS, macOS, watchOS, tvOS), plus concis, avec un live preview. UIKit est plus mature, avec plus de contrôle sur les détails. En 2026, SwiftUI est recommandé pour les nouveaux projets.
5. Expliquez les property wrappers @State, @Binding, @ObservedObject, @StateObject et @EnvironmentObject.
@State : source de verite locale à une vue (types valeur). @Binding : référence bidirectionnelle vers un @State parent (pas de propriété, juste un lien). @StateObject : cree et possède un ObservableObject (cree une seule fois). @ObservedObject : observe un ObservableObject possède ailleurs (peut être recree). @EnvironmentObject : ObservableObject injecte dans l'environnement, accessible partout dans la hiérarchie. Règle : @StateObject pour créer, @ObservedObject pour recevoir.
6. Comment gérer la concurrence en Swift avec async/await ?
Swift 5.5 introduit la concurrence structurée avec async/await. Declarez une fonction asynchrone avec async, appelez-la avec await. Task lance une opération asynchrone. TaskGroup execute plusieurs tâches en parallèle. Les actors protegent l'état mutable des accès concurrents (isolation). @MainActor garantit l'exécution sur le thread principal (pour les mises à jour UI). Cette approche est plus sure et lisible que les callbacks et GCD.
7. Qu'est-ce que le pattern MVVM en iOS ?
MVVM (Model-View-ViewModel) separe l'application en trois couches : Model (données et logique métier), View (interface utilisateur, SwiftUI Views), ViewModel (transforme les données du Model pour la View, gere la logique de présentation). Le ViewModel est un ObservableObject dont les propriétés @Published sont observees par la View. Avantages : testabilite (le ViewModel est testable sans UI), séparation des responsabilités, et compatibilité naturelle avec SwiftUI.
8. Comment persister les données en iOS ?
Options : UserDefaults (préférences simples, petites quantites), Keychain (données sensibles, mots de passe, tokens), Core Data (base de données ORM d'Apple, relations, requêtes complexes), SwiftData (successeur de Core Data, plus simple, base sur les macros Swift), SQLite (accès SQL direct), fichiers (JSON, Plist). Pour la synchronisation cloud : CloudKit (gratuit avec iCloud) ou Firebase. Choisissez selon la complexité et la sensibilite des données.
9. Comment distribuer une application iOS sur l'App Store ?
Processus : inscrivez-vous au Apple Developer Program (99 USD/an). Configurez les certificats (signing certificates), provisioning profiles et App ID dans le portail développeur. Archivez l'application dans Xcode (Product > Archive). Soumettez via App Store Connect : remplissez les métadonnées (description, screenshots, catégorie), configurez le prix, soumettez pour review (1-3 jours). Respectez les App Store Review Guidelines pour éviter le rejet.
10. Comment tester une application iOS ?
XCTest : framework de test natif pour les tests unitaires et d'intégration. XCUITest : tests d'interface utilisateur automatises. Snapshot testing : comparaison visuelle des vues (biblioteque pointfreeco/swift-snapshot-testing). Instruments : profiling des performances, mémoire, réseau, énergie. En SwiftUI, testez les ViewModels en isolation (logique métier) et utilisez les previews pour le test visuel rapide. Intégrez les tests dans votre CI/CD (Xcode Cloud, Fastlane).