Les espaces de nom en Swift

Les espaces de nom (ou namespaces en anglais) en Swift sont des regroupements logiques de code qui permette de mieux architecturer les applications en contrôlant les accès de chacune des classes, méthodes et variables. Ces modules permettent également de résoudre les collisions de nom. Dans ce cours nous allons voir comment cela fonctionne au travers de différent example.

Pour illustrer la gestion des conflits de nom voici un petit example :

let a = "swift"
let a = "tuto" // Definition conflicts with previous value

Vous pensez peut-être ceci est un exemple stupide. Vous ne feriez jamais cela, et vous avez probablement raison. Mais imaginez ce scénario dans un cas plus complexe. Dans l’article où nous comparons les performances entre SwiftyJSON et Freddy, les deux librairies utilisent un object JSON différent. Donc comment faire la différence entre les 2 implémentations ?

C’est là que les namespaces aussi appelés modules font leurs apparitions. Et pour utiliser un module dans une classe, il faut l’importer grâce au mot clé import :

import Freddy
import SwiftyJSON

let data: NSData = // ...
let freddyJSON   = Freddy.JSON(data: data)
let swiftyJSON   = SwiftyJSON.JSON(data: data)

Comme vous pouvez le voir, en Swift un espace de nom est une partie nommé du programme. Ici par example il y a 2 modules, Freddy et SwiftyJSON qui permettent de grouper du code virtuellement. Cela nous permet d’accéder à des noms identiques sans conflit en mentionnant l’espace de nom d’abord. De plus chacun de ces modules définissent un ensemble de classe et de fonction qui sont packagé à l’intérieur de celui ci et qui défini un ensemble de contrôleur d’accès comme private, internal et public.

Comme l’explique Chris Lattner, le concepteur de Swift, et contrairement à d’autres langages, la déclaration des namespaces se fait de manière implicite. Cela signifie que nous n’avons pas à déclarer explicitement les espaces de nom par nous-même. Swift créé un espace de nom pour chaque application, chaque framework importé, etc.

Accéder aux éléments à l’intérieur d’un espace de nom

Pour accéder aux éléments d’un namespace depuis l’extérieur, comme nous l’avons vu précédemment, il faut tout d’abord importer ce module. Pour cela nous utilisons le mot clé import suivi par le nom du module :

import ModuleName

Par défaut, ceci importe tous ce que contient le module et qui est public pour le rendre accessible dans le code. En plus de la forme de base, nous pouvons également importer des symboles spécifiques à partir d’un module. Pour cela il nous faut utiliser le mot-clé import suivi du nom du module puis de la classe (ou fonction, ou variable, etc.) que nous souhaitons importer :

import itemType ModuleName.ItemName

Le type d’élément peut être un de ceux là :

  • typealias
  • struct
  • class
  • enum
  • protocol
  • var
  • func

Par example, disons que nous voulons importer uniquement la classe NSString du framework Foundation :

import class Foundation.NSString

Cette syntaxe est un example sur la manière d’accéder à un élément à l’intérieur d’un espace de nom.

Pour finir il est a noté qu’il n’est pas fréquent d’utiliser les préfixes des namespaces explicitement car Swift gère cela naturellement pour nous. La plupart du temps quand on importe un framework nous pouvons utiliser ses méthodes et classes directement car Swift comprend de lui même que la méthode ou la classe appartient à ce module. Les préfixes sont utile uniquement en cas de conflit quand Swift n’arrive pas à choisir entre plusieurs noms.

Conclusion

A présent, vous devriez avoir une bien meilleure compréhension des espaces de nom et comment ils affectent le code Swift que vous écrivez. Comme toujours, si vous n’avez des questions ou si vous pensez que nous devons ajouter quelques précisions, laisser vos commentaires en utilisant le formulaire ci-dessous.

1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles (1 votes, average: 5,00 out of 5)
Loading...
Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPin on PinterestShare on RedditDigg this

Aucun commentaire

Time limit is exhausted. Please reload CAPTCHA.