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
.
Namespacing is implicit in swift, all classes (etc) are implicitly scoped by the module (Xcode target) they are in. no class prefixes needed
— Chris Lattner (@clattner_llvm) June 6, 2014
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.