Comment réussir un entretien Swift : les questions essentielles
Un entretien pour un poste de développeur iOS ne consiste pas seulement à vérifier la connaissance des frameworks, mais aussi à comprendre en profondeur le langage Swift. Les employeurs veulent voir un candidat qui maîtrise la gestion de la mémoire, la concurrence et les particularités de la syntaxe. Dans cet article, nous avons rassemblé les questions les plus fréquemment posées lors des entretiens, avec des réponses détaillées et des exemples de code. Cet article sera utile aussi bien aux juniors qu'aux développeurs expérimentés souhaitant rafraîchir leurs connaissances avant un entretien.
1. Les bases de Swift : types, optionnels et gestion de la mémoire
Les questions de base vérifient à quel point vous comprenez les concepts fondamentaux du langage. Commençons par le plus populaire : les optionnels.
Question 1 : Que sont les optionnels et à quoi servent-ils ?
Réponse : Les optionnels sont un mécanisme de sécurité des types qui permet à une variable soit de contenir une valeur, soit d'être nil (absence de valeur). Ils résolvent le problème des pointeurs null, courant dans d'autres langages.
// Déclaration d'un optionnelvar name: String? = "Anna"name = nil // la variable ne contient plus de valeur
// Extraction sécurisée (optional binding)if let unwrappedName = name { print("Bonjour, \\(unwrappedName)")} else { print("Nom absent")}
// Extraction forcée (force unwrap) — dangereux !// let forcedName = name! // crash si name == nilQuestion 2 : Quelle est la différence entre struct et class ?
Réponse : struct est un type valeur (value type), tandis que class est un type référence (reference type). Les structures sont copiées lors de l'affectation, les classes sont transmises par référence. De plus, les classes supportent l'héritage, contrairement aux structures.
struct Point { var x: Int var y: Int}
class Person { var name: String init(name: String) { self.name = name }}
var pointA = Point(x: 1, y: 2)var pointB = pointA // copiepointB.x = 10print(pointA.x) // 1 — l'original n'a pas changé
var personA = Person(name: "Ivan")var personB = personA // référence au même objetpersonB.name = "Pierre"print(personA.name) // "Pierre" — a changéQuestion 3 : Comment fonctionne l'Automatic Reference Counting (ARC) ?
Réponse : L'ARC compte automatiquement le nombre de références fortes vers un objet d'une classe. Lorsque le compteur atteint zéro, l'objet est libéré de la mémoire. Des problèmes surviennent avec les références cycliques (retain cycles), qui sont résolues à l'aide de références weak ou unowned.
class Parent { var child: Child?}
class Child { weak var parent: Parent? // weak empêche le retain cycle}
var parent: Parent? = Parent()var child: Child? = Child()parent?.child = childchild?.parent = parent2. Concepts avancés : closures, protocoles et génériques
À l'étape suivante, l'intervieweur vérifie si vous savez utiliser les fonctionnalités fonctionnelles de Swift.
Question 4 : Que sont les closures et comment capturent-elles les valeurs ?
Réponse : Une closure est un bloc de code qui peut être transmis et utilisé comme une fonction. Elle capture les variables du contexte environnant. La capture peut être forte ou faible.
func makeIncrementer(incrementAmount: Int) -> () -> Int { var total = 0 let incrementer: () -> Int = { total += incrementAmount // capture de total return total } return incrementer}
let incrementByTwo = makeIncrementer(incrementAmount: 2)print(incrementByTwo()) // 2print(incrementByTwo()) // 4Question 5 : Quelle est la différence entre un protocole et une classe abstraite ?
Réponse : Il n'y a pas de classes abstraites en Swift. Un protocole définit un contrat (exigences) que les classes, structures ou énumérations doivent implémenter.