Téléchargez Votre Exemplaire Gratuit de
Le Manuel manquant
pour le Développement Rapide

Le Guide Que j’Aurais Aimé Avoir Quand j’Ai Commencé

Rejoignez plus de 20 000 Développeurs Qui Découvrent le Développement Swift

Téléchargez Votre Copie gratuite

Si vous regardez cela, je suppose que vous connaissez les extensions Swift. Une extension Swift vous permet d’ajouter des fonctionnalités à un type, une classe, une structure, une énumération ou un protocole. Mais les extensions sont plus puissantes que cela. Dans cet épisode, j’aimerais vous montrer quatre utilisations intelligentes des extensions Swift.

Conformité du protocole

Le langage de programmation Swift mentionne que les extensions peuvent être utilisées pour conformer un type existant à un protocole. Bien que ce ne soit pas nouveau ou révolutionnaire, cela peut également vous aider à organiser votre code.

Prenons les protocoles UITableViewDataSource et UITableViewDelegate comme exemple. Cet exemple peut sembler familier. C’est bien, mais cela entraîne une longue implémentation de classe qui peut devenir difficile à naviguer avec le temps.

import UIKitclass ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { ...}

Vous pouvez organiser votre code en créant une extension pour chaque protocole auquel le type est conforme.

import UIKitclass ViewController: UIViewController { ...}extension ViewController: UITableViewDataSource { ...}extension ViewController: UITableViewDelegate { ...}

La navigation dans les fichiers source devient également plus facile si vous prenez l’habitude d’utiliser la barre de saut en haut de l’éditeur de source de Xcode.

 La navigation dans les fichiers source devient également plus facile si vous prenez l'habitude d'utiliser la barre de saut en haut de l'éditeur de source de Xcode.

Préservation des initialiseurs

J’ai appris la prochaine astuce de Chris Eidhof. Pour cet exemple, nous devons d’abord définir une structure, Person. La structure définit deux propriétés constantes de type String, first et last.

struct Person { // MARK: - Properties let first: String let last: String}

Swift crée généreusement un initialiseur pour nous, init(first:last:), que nous pouvons utiliser pour instancier une instance de la structure Person. Ce n’est pas nouveau.

let john = Person(first: "John", last: "Doe")

Malheureusement, l’initialiseur n’est plus disponible si nous définissons un initialiseur personnalisé dans la définition de la structure.

struct Person { // MARK: - Properties let first: String let last: String // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

 L'initialiseur n'est plus disponible si nous définissons un initialiseur personnalisé dans la définition de la structure.

Heureusement, nous avons une solution de contournement facile pour résoudre ce problème. Nous créons une extension pour la structure Person dans laquelle nous définissons l’initialiseur personnalisé.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

 Une extension résout le problème.

Séparation de code

Nous pouvons prendre l’exemple précédent un peu plus loin. Il y a quelques années, Natasha Murashev a décrit une technique qui utilise des extensions pour séparer l’état du comportement. Si nous appliquons cette technique à l’exemple précédent, nous nous retrouvons avec quelque chose comme ça.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" } // MARK: - Public API var asDictionary: { return }}

La définition de type définit uniquement les propriétés stockées. Une extension est créée pour le comportement du type, c’est-à-dire les méthodes et les propriétés calculées. Le résultat est une séparation claire de l’état (propriétés stockées) et du comportement (méthodes et propriétés calculées).

Nous pouvons aller plus loin en créant une deuxième extension privée pour le comportement privé.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { ...}private extension Person { ...}

La séparation et l’organisation du code sont très faciles à faire à l’aide d’extensions. Je l’utilise tout le temps. Si vous manquez les fichiers d’en-tête d’Objective-C, c’est une bonne alternative.

Types imbriqués

Le langage de programmation Swift mentionne que les extensions vous permettent également de définir et d’utiliser des types imbriqués. Mais je pense que cette fonctionnalité est sous-évaluée. Je l’utilise dans chaque projet Swift, par exemple, pour définir des constantes.

Il y a quelques mois, j’ai publié un tutoriel sur la création d’un contrôle personnalisé à l’aide d’un masque de bits. Dans ce tutoriel, nous stockons la valeur brute du masque de bits dans la base de données des valeurs par défaut de l’utilisateur.

// MARK: - [email protected] func scheduleDidChange(_ sender: SchedulePicker) { // Helpers let userDefaults = UserDefaults.standard // Store Value let scheduleRawValue = sender.schedule.rawValue userDefaults.set(scheduleRawValue, forKey: UserDefaults.Keys.schedule)}

Au lieu d’utiliser un littéral de chaîne, nous utilisons une constante. Nous créons une extension pour la classe UserDefaults dans laquelle nous définissons une énumération sans cas, Keys. L’énumération définit une propriété constante statique de type String, schedule.

extension UserDefaults { enum Keys { static let schedule = "schedule" }}

Le résultat est plutôt sympa si vous me le demandez. Non seulement nous pouvons regrouper les constantes, en évitant les littéraux qui sont dispersés dans la base de code, mais nous nommons également les constantes. En d’autres termes, les constantes sont faciles à retenir et ont un sens.

UserDefaults.Keys.schedule

Avec la sortie de Swift 3, Apple a adopté une technique similaire dans certains de ses frameworks.

Notification.Name.UIApplicationWillTerminate

What’s Next

Les extensions sont assez puissantes dans Swift et les techniques que j’ai montrées dans ce tutoriel ne sont que quelques exemples de ce qui est possible.

Téléchargez Votre Exemplaire gratuit de
Le Manuel manquant
pour un Développement Rapide

Le Guide Que J’Aurais Aimé Avoir Quand J’Ai Commencé

Rejoignez Plus De 20 000 Développeurs Qui Découvrent Le Développement Swift

Téléchargez Votre Copie Gratuite

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.