Programmation rapide 101 : Collections avancées

Les collections avancées de Swift peuvent vous aider à modéliser des objets plus complexes dans vos applications et à créer une API plus facile à comprendre et à utiliser. Dans cet article, je modélise un échiquier en utilisant les indices de Swift et je couvre également les tuples et les tableaux multidimensionnels !

Maîtrisez votre iPhone en une minute par jour :

Inscrivez-vous à la newsletter "Tip of the Day" de iphonologie et nous vous enverrons chaque jour un conseil pour gagner du temps et tirer le meilleur parti de votre iPhone ou iPad.

Que sont les tuples et pourquoi les utiliser ?

Les tuples de Swift (prononcés comme "tooples" ou "tupples") permettent de créer un groupe de valeurs connexes. Contrairement aux tableaux et aux dictionnaires, un tuple peut contenir des valeurs de différents types. Les tuples sont particulièrement utiles pour renvoyer des valeurs multiples à partir d'une méthode.

Voyons un exemple qui montre comment les tuples peuvent être utilisées dans vos applications. Vous pouvez télécharger l'exemple de projet à partir de ce lien .

  1. Ouvrez le TuplesDemo exemple de projet en Xcode.
  1. Lançons le projet pour avoir un aperçu de ce que fait l'application. Cliquez sur le bouton Run de Xcode , et lorsque l'application apparaît dans le simulateur, vous devriez voir la scène illustrée dans la figure 1 .

Figure 1 - La TuplesDemo scène principale

Il s'agit d'une application très simple qui vous permet d'ajouter de nouveaux lieux à la base de données de l'application en utilisant les données de base.

  1. Sans entrer un nom de lieu, cliquez sur le bouton Ajouter un lieu . Vous devriez voir une alerte vous indiquant que vous devez entrer un nom de lieu ( Figure 2 ).

Figure 2 - L'alerte TuplesDemo champs obligatoires

  1. Cliquez sur OK pour fermer l'alerte. Saisissez maintenant un Nom du lieu (par exemple Los Angeles, Paris, Pékin) et cliquez à nouveau sur Ajouter un lieu . Vous devriez voir l'alerte affichée dans Figure 3 indiquant que le lieu a été enregistré avec succès dans la base de données.

Figure 3 - Le lieu a été sauvegardé avec succès !

  1. Retournez à Xcode et cliquez sur le bouton Stop . Examinons le code qui utilise des tuples pour réaliser tout cela.
  1. Développez le groupe Business Layer et sélectionnez le fichier mmBusinessObject.swift dans le navigateur de projet. Dans la partie supérieure du fichier, vérifiez la déclaration de la méthode saveEntity :

  1. Examinez attentivement la valeur de retour. Cette déclaration vous indique que la méthode saveEntity renvoie un tuple contenant deux valeurs de retour nommées. La première est nommée state et son type est saveState . La seconde est nommée message et son type est String ? .

SaveState est une énumération déclarée en haut du fichier de code mmBusinessObject.swift :

L'énumération SaveState contient trois valeurs possibles reflétant trois résultats possibles de la sauvegarde de l'entité dans la base de données :

  • Erreur - Une erreur s'est produite.
  • RulesBroken - une règle métier a été enfreinte (généralement, un champ obligatoire est laissé vide.)
  • SaveComplete - L'entité a été sauvegardée avec succès.

Nous pourrions simplement renvoyer la valeur de SaveState de cette méthode, mais nous pouvons créer une meilleure interface pour la classe mmBusinessObject en renvoyant également un message qui contient une explication plus détaillée de ce qui s'est passé. C'est là que les tuples viennent à la rescousse !

  1. Notez qu'il y a deux variables en haut de la méthode saveEntity . La variable saveState stocke le résultat de l'opération saveEntity , et la variable saveMessage contient tout message que nous voulons renvoyer à partir de cette méthode.

Le code sous les variables est un peu complexe, mais pour l'instant, il suffit de savoir que ces deux variables sont définies en fonction du résultat de l'opération de sauvegarde.

  1. Regardez maintenant l'instruction return au bas de la méthode :

Pour créer une valeur de retour de tuple nommée, indiquez le nom, un deux-points et la valeur. Séparez les valeurs par une virgule et placez les valeurs de retour entre parenthèses.

Notez que vous pouvez nommer les valeurs dans un tuple Swift. Cela les rend beaucoup plus utiles que dans d'autres langues où vous ne pouvez pas le faire. Vous n'êtes pas obligé de nommer les valeurs du tuple, mais le fait de les nommer rend votre code beaucoup plus lisible et intuitif.

  1. Voyons comment les valeurs de retour des n-uplets sont traitées. Cliquez sur ViewController.swift dans le navigateur de projet. Vérifiez la troisième ligne de code dans la méthode addLocation :

Remarquez que le type de la variable résultat est le même que le type renvoyé par la méthode saveEntity . C'est un tuple ! Puisque chaque valeur de tuple est nommée, l'objectif de chaque valeur est clair comme de l'eau de roche.

J'ai inclus le type de la variable de résultat pour que vous puissiez mieux comprendre le code. Cependant, vous pouvez supprimer la déclaration de type et Swift le découvrira pour vous en utilisant l'inférence de type.

Le reste du code utilise une déclaration de commutation pour effectuer des actions et afficher des messages basés sur les valeurs du tuple.

Voici quelques règles de base pour les tuples :

  • Les valeurs contenues dans un tuple peuvent être de n'importe quel type.
  • Un tuple peut contenir un nombre quelconque de valeurs, bien que plus de deux ou trois devienne encombrant.
  • Vous pouvez décomposer les valeurs contenues dans un tuple en variables ou constantes individuelles :

  • Si vous n'avez besoin que d'une seule des valeurs du tuple, vous pouvez utiliser un trait de soulignement pour ignorer les autres valeurs :

  • Vous pouvez également accéder aux valeurs dans un tuple en utilisant un index numérique :

  • Il est préférable de nommer les valeurs dans le tuple et d'accéder ensuite aux valeurs en utilisant ces noms :

Tableaux multidimensionnels

Vous pouvez créer des tableaux à plus d'une dimension. Dans Swift, vous créez effectivement un "tableau de tableaux" où chaque membre d'un tableau contient une référence à un autre tableau. Par exemple, dans Figure 4 , chaque élément du tableau de gauche fait référence à un deuxième tableau de droite contenant trois éléments.

Figure 4 - Un tableau à deux dimensions

Vous déclarez un tableau multidimensionnel en imbriquant des paires de crochets. Par exemple, ce code déclare un tableau d'entiers bidimensionnel :

Vous initialisez un tableau multidimensionnel vide comme celui-ci :

Le tableau de cordes bidimensionnel de la figure 4 est dimensionné et initialisé comme suit :

Vous référencez les éléments dans un tableau multidimensionnel en utilisant deux séries de crochets. Le premier ensemble de crochets fait référence au tableau extérieur, et le second au tableau intérieur. Par exemple, étant donné le tableau de la figure 4 :

Dans la section suivante, vous verrez une application pratique des endroits où vous pouvez utiliser des tableaux multidimensionnels dans vos applications iOS.

Créer des collections personnalisées

Les cours de recouvrement de Swift répondent à la plupart des besoins pour vos applications iOS. Toutefois, dans des cas particuliers, vous pouvez souhaiter déclarer vos propres classes de recouvrement. Cela nécessite l'utilisation des indices de Swift.

Voyons comment nous pouvons utiliser les indices pour créer une classe Échiquier qui nous permet d'accéder à des cases individuelles de l'échiquier.

La figure 5 montre un échiquier avec une notation algébrique légèrement modifiée - une notation courante utilisée pour enregistrer une partie d'échecs.

Figure 5 - Un échiquier avec notation algébrique

Les lignes du tableau sont numérotées de 1 à 8 , et les colonnes de à h . Chaque pièce d'échecs a une désignation à deux caractères. Les pièces noires commencent par la lettre B et les pièces blanches par la lettre W . La deuxième lettre précise le type de pièces : R = Tour, N = Nuit, B = Fou, Q = Reine, K = Roi, P = Pion. (Voici où ma notation s'écarte - en notation algébrique standard, l'absence de lettre indique un pion).

Pour faire référence à une case spécifique sur l'échiquier, vous utilisez une notation à 2 caractères composée de colonne/rangée. Par exemple, la case située dans le coin inférieur gauche de l'échiquier est a1 . La case située dans le coin supérieur droit est h8 .

Pour modéliser cette notation colonne/ligne, nous pouvons créer un indice personnalisé pour une classe d'échiquier et l'utiliser en combinaison avec un tableau de chaînes de caractères à deux dimensions. Cela nous permet de référencer un carré comme celui-ci :

Syntaxe d'abonnement

Voici la syntaxe pour déclarer un indice dans Swift :

Cette syntaxe est similaire à celle des propriétés calculées. Vous commencez la déclaration par le mot-clé en indice , suivi d'un ou plusieurs paramètres d'entrée qui acceptent la ou les valeurs utilisées pour récupérer un élément spécifique de la collection. Ensuite, vous spécifiez le type de retour, qui est le type de la valeur retournée de la collection.

La méthode get est exécutée lors de la récupération d'une valeur dans la collection, et la méthode set est exécutée lors du stockage d'un élément dans la collection. Vous pouvez créer une collection en lecture seule en omettant la méthode set .

L'échantillon sur l'échiquier

Examinons un exemple de code qui démontre deux indices en action. Vous pouvez télécharger l'exemple de code à l'adresse ce lien .

Ouvrez le fichier Subscripts.playground en Xcode. En haut du terrain de jeu, une classe Échiquier est déclarée. Cette classe comporte un tableau de chaînes de caractères bidimensionnel nommé échiquier qui modélise les cases sur un échiquier. Elle contient un tableau de huit éléments, représentant les lignes d'un échiquier. Chaque élément de ligne contient un autre tableau de huit éléments qui représentent les colonnes sur un échiquier :

Le tableau est initialisé avec des pièces d'échecs situées sur des cases comme au début d'une partie ( Figure 5 ).

La classe Échiquier dispose également de deux dictionnaires :

Le dictionnaire rows accepte une lettre de rangée et renvoie le numéro de rangée correspondant. Le dictionnaire colonnes accepte une chaîne de colonne et renvoie le numéro de colonne correspondant. Nous pourrions disposer du tableau de colonnes et effectuer un simple calcul mathématique pour déterminer le numéro de colonne. Mais, dans un souci de découverte, j'ai choisi d'utiliser une méthodologie similaire pour les lignes et les colonnes (en choisissant la clarté plutôt que l'intelligence.)

Ensuite, dans la cour de récréation, se trouve la première déclaration d'indice :

Cet indice accepte un paramètre String (la paire colonne/ligne) et renvoie une chaîne facultative (la pièce d'échecs). La valeur de retour doit être optionnelle car vous pouvez passer dans une colonne/ligne non valide (comme z9 ), auquel cas l'indice renvoie nil .

Si les numéros de colonne et de ligne sont valides, ils sont utilisés pour récupérer la pièce d'échecs qui se trouve sur la case correspondante dans le tableau bidimensionnel de l'échiquier :

Cette pièce d'échec est ensuite retournée par le receveur.

Pour essayer cet indice, au bas de la cour de récréation, essayez de saisir différentes paires de colonnes/rubriques. Par exemple, La figure 6 montre les résultats de la saisie de deux paires de colonnes/lignes valides et d'une paire de colonnes/lignes non valides.

Figure 6 - Test du premier indice

Regardez plus bas dans la cour de récréation pour voir le deuxième indice déclaré pour la classe d'Échiquier :

Cet indice accepte un paramètre de type ligne caractère et un paramètre de type colonne Int (par exemple, "C", 7), et renvoie la pièce d'échecs comme une chaîne optionnelle String . Les abonnements peuvent accepter n'importe quel nombre et type de paramètres d'entrée et renvoyer n'importe quel type.

Au bas de la cour de récréation, essayez différentes combinaisons de lignes et de colonnes comme dans Figure 7 .

Figure 7 - Test du deuxième indice

Cet indice nécessite moins de code de vérification d'erreur car les paramètres d'entrée sont plus strictement définis. Cependant, il est moins naturel à utiliser car vous devez passer chaque caractère séparément plutôt que d'utiliser la combinaison ligne/colonne plus familière du premier indice.

J'ai ajouté ce deuxième indice pour vous montrer comment accepter de multiples paramètres. En fin de compte, je choisirais le premier indice dans une application du monde réel parce que, même si j'ai dû initialement écrire un peu plus de code, cela a produit une classe avec une interface plus intuitive.

Conclusion

Les tuples, les tableaux multidimensionnels et les indices offrent des fonctionnalités de collecte plus avancées que vous pouvez mettre en œuvre pour des cas particuliers dans vos applications iOS. Ils constituent un autre ensemble d'outils que vous pouvez apprendre et développer sur votre chemin pour devenir un meilleur développeur d'applications !

Click to rate this post!
[Total: 0 Average: 0]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *