# Swift (langage d'Apple)

Swift est un langage de programmation objet compilé, multi-paradigmes, qui se veut simple, performant et sûr. Il est développé en open source.
Le projet de développement de Swift est géré par Apple, qui en est également le principal contributeur ; mais de nombreux membres de la communauté Swift, ainsi que d'autres acteurs, tels que Google et IBM, participent également à son développement. Swift est officiellement supporté sur les systèmes d'exploitation Ubuntu, iOS, macOS, watchOS et tvOS. Un support non officiel (géré par la communauté) existe pour d'autres plateformes Linux, telles que Debian et Fedora.
Un manuel officiel en anglais est disponible en ligne.
Swift dispose d'une interopérabilité avec le langage C ainsi qu'avec l'Objective-C sur les plateformes d'Apple.
Le compilateur de Swift utilise LLVM pour la génération du code machine.
Swift 5.9 sort en septembre 2023 ajoutant un système de macros, des « parameter packs » (permettant d'avoir un nombre variable de types générique aux arguments d'une fonction) et des fonctionnalités de propriété qui donnent davantage de contrôles sur la gestion de la mémoire et les performances.
La version 5.10 sortie en mars 2024 améliore le modèle de concurrence du langage, permettant une pleine isolation des données évitant ainsi les situations de compétition sur les données. C'est également la dernière version avant l'arrivée de Swift 6.
Swift 6 a été présenté durant la WWDC 2024 et introduit Swift Concurrency. Cette version prend désormais en charge Debian, Fedora et Ubuntu 24.04.

## Historique

Le développement de Swift a été commencé en 2010 par Chris Lattner et prend ses sources dans de nombreux langages de programmation tels qu'Objective-C, Haskell, Ruby, Python, Caml ou C#. La première version publique (1.0) a été publiée le 2 juin 2014 à la WWDC 2014.
En juin 2015, Apple annonce le passage en open source du langage Swift lors de la WWDC 2015, et celui-ci est effectif en décembre de la même année. La version 3.0 de Swift est lancée en septembre 2016. La version 4.0 est disponible depuis le 19 septembre 2017 et se concentre principalement sur la stabilité de la syntaxe du code source. La version 5.0 est disponible depuis le 25 mars 2019 et apporte principalement la stabilisation de l'ABI.

### Réception

Swift a été bien accueilli par les développeurs habitués aux technologies d'Apple. Ceux-ci l'ont notamment jugé plus simple et plus concis que l'Objective-C.
Certains développeurs ont annoncé qu'ils développeraient de nouveaux logiciels entièrement en Swift. C'est le cas, par exemple, de Brent Simmons (développeur à l'origine de MarsEdit et NetNewsWire), qui a annoncé que la version Mac de son logiciel Vesper serait développée entièrement avec Swift. Facebook a également ajouté la prise en charge de Swift à Parse.
Quelques jours après sa présentation, Swift était en passe d'entrer dans la liste des 20 langages de programmation les plus populaires (index TIOBE). Au plus haut, Swift a été classé à la 9e place au classement TIOBE au mois de janvier 2020.
Le livre The Swift Programming Language avait été téléchargé plus de 370 000 fois le lendemain de l'annonce de Swift à la WWDC 2014.

### Réactivité d'Apple face aux retours des développeurs

Apple affirme clairement prendre en compte les retours des développeurs pour améliorer Swift.
Une critique des développeurs à propos des premières versions de Swift était l'absence d'access modifier (tels que ceux qui existent en Objective-C) ; alors qu'Apple ne communique que rarement sur les futures fonctionnalités de ses produits, un ingénieur d'Apple répond aux développeurs, leur annonçant que ceux-ci seraient ajoutés dans les futures mises à jour de Swift. Le 21 juillet 2014, Apple ajoute ceux-ci à Swift.
Mi-juillet 2014, Apple ouvre sur son site web un blog consacré à Swift dans lequel les ingénieurs d'Apple parlent des coulisses de la création de Swift ainsi que des dernières nouveautés et conseils à propos de ce langage.

## Licence

Le 8 juin 2015, Apple annonce que le code du compilateur et des bibliothèques standard seront distribués sous une licence open source.
Apple affirme que des contributions de la communauté seront acceptées et encouragées.
Depuis le 3 décembre 2015, Swift est désormais disponible sous licence Apache 2.0. Le code ouvert inclut le compilateur, les bibliothèques standard du langage ainsi qu'un gestionnaire de paquets.

## Plateformes supportées

Swift est officiellement supporté sur les plateformes d'Apple, sur Linux (Ubuntu, CentOS 8, Amazon Linux 2) et Windows (depuis la version 5.3)$^,$.
Le support est assuré de manière non officielle pour Android, Linux sur l'architecture ARM, Windows, WebAssembly et d'autres systèmes. L'équipe responsable du développement de Swift a annoncé vouloir supporter officiellement de nouvelles plateformes$^,$.

## Syntaxe du langage
### Variables et constantes

Les variables et les constantes permettent de stocker des informations. Swift supporte entre autres les types Int, Double, Float, Char, String et Bool.

#### Variables

Swift infère le type de variable, c'est-à-dire qu'il n'est pas nécessaire de préciser le type d'une variable lors de sa création. Si besoin, il est possible de le préciser explicitement.

#### Constantes

Les constantes sont à utiliser pour toute valeur qui restera inchangée lors du programme.

#### Noms des variables

Il est possible de nommer une variable avec à peu près n'importe quel caractère Unicode, par exemple :
Les noms des variables, constantes et autres éléments de Swift ne comportent pas d'espaces.

### Conditions

Il existe plusieurs types de conditions en Swift, notamment if, switch et if let.

#### Condition if

Il est également possible d'utiliser else if :

#### Condition switch

En Swift, pour des raisons de sûreté, les conditions de type switch doivent être exhaustives, c'est-à-dire qu'il est nécessaire de gérer toutes les valeurs que peut prendre la variable concernée. Pour que le switch soit exhaustif il faut ou bien tester explicitement toutes les valeurs possibles de la variable (lorsque cela est possible, typiquement dans le cas des énumérations qui n'ont qu'un nombre réduit de valeurs possibles), ou bien en ajoutant default dont les instructions seront exécutées si aucun des case précédents ne correspondait à la valeur de la variable testée.
Il est également possible de tester plusieurs résultats à la fois :

##### Comparaison avec le switch du langage C

Contrairement au langage C, il n'est pas nécessaire d'ajouter l'instruction break après chaque cas d'un switch : celle-ci est présente implicitement. Si l'on souhaite reproduire explicitement le comportement «fall through» de C, on peut utiliser l'instruction fallthrough.
Par ailleurs, le switch de Swift est une structure de contrôle de première classe et non pas l'équivalent d'un goto comme en C, ce qui signifie que chaque case dispose par défaut d'un contexte qui lui est propre.

### Boucles

Il existe plusieurs types de boucles en Swift, notamment while, repeat while et for in. Tout comme les conditions, les conditions de boucles ne nécessitent pas d'être entourées par des parenthèses. Les boucles for "type C" présentes depuis Swift 1.0 disparaissent avec Swift 3.0, car elles sont jugées inutiles comparées aux boucles for in.

#### Boucles while

Les boucles while sont sans doute les boucles les plus élémentaires, elles répètent leurs instructions tant que leur condition est vraie.

#### Boucles for in

Les boucles « for in » sont sans doute les plus fréquentes et aussi les plus puissantes en Swift, en plus de leur expressivité, elles améliorent la sûreté (en évitant par exemple les boucles infinies) ainsi que les performances (le langage peut se passer de certaines vérifications d'intégrité de la mémoire).
La syntaxe type prend la forme for élément in séquence où élément correspond au nom de la constante qui, à chaque tour de boucle, se verra affecter une valeur d'un élément de séquence où séquence peut être un tableau, un dictionnaire ou n'importe quel autre type séquentiel.
Le code suivant :
Serait écrit ainsi à l'aide de « while » :
En plus d'être plus expressive, la boucle for in évite certaines erreurs de programmation telles que l'accès à un index erroné ou encore la création d'une boucle infinie.
À l'instar d'une boucle for en C, Swift permet de réaliser une itération sur un intervalle scalaire grâce à l'opérateur d'intervalle fermé « ... » :

#### Boucles repeat while

La boucle repeat while (équivalente à une boucle do while dans d'autres langages) permet de répéter au moins une fois les instructions de la boucle. C'est seulement après la première exécution des instructions que la condition est vérifiée afin de répéter ou non la boucle.

### Optionnels

Un optionnel est un type générique permettant de représenter, pour tout type donné, une valeur ou bien l'absence de valeur. Afin de déclarer un type optionnel, on fait suivre son nom d'un point d'interrogation, par exemple Int? ou encore Double?. Un exemple d'utilisation d'un type optionnel est la conversion d'une chaine de caractère String vers un entier :
Ici, entierOptionel sera de type Int?, c'est-à-dire un entier optionnel, en effet, il se peut que notre chaîne de caractères ait une valeur ne correspondant pas à un nombre entier, par exemple "J'aime les crêpes" ou encore "2,334". Dans de tels cas il n'est pas possible de convertir la chaîne vers un entier, et entierOptionel n'aura donc pas de valeur c'est-à-dire qu'il sera nil. Dans le cas où la chaîne de caractères contiendrait une valeur convertible, par exemple "12", la conversion aurait été possible et entierOptionel aurait bien contenu une valeur, 12 dans notre exemple.
Swift ne permet pas d'utiliser un type optionnel directement, par exemple le code suivant produit une erreur :
En effet, il faut déballer («unwrap» en anglais) l'optionnel, c'est-à-dire accéder explicitement à sa valeur à l'aide d'une des nombreuses syntaxes prévues à cet effet.

#### Condition if let

La condition if let est un type de condition permettant d'accéder à la valeur d'une variable, si celle-ci en contient une, dans un bloc de code :

#### Opérateur ??

L'opérateur ?? permet un grand gain d'espace et de lisibilité dans certains cas, ainsi, le code suivant :
Est remplaçable par une seule ligne:

#### Déballage forcé

Dans certains cas, on est totalement sûr qu'une valeur ne sera jamais nil, on ajoute alors un point d'exclamation après la valeur optionnelle ce qui permet d'accéder directement à sa valeur:
Il faut toujours être totalement sûr qu'une valeur est bien présente avant de réaliser une telle opération, en effet, Swift terminera immédiatement l'exécution du programme avec l'erreur appropriée si l'on tente d'accéder ainsi à une valeur qui n'existe pas.

#### Comparaison avec NULL en C

On peut quelque part voir une certaine ressemblance entre le nil des optionnels Swift et le NULL de C.
Bien qu'en C NULL permette parfois à certaines fonctions de représenter l'absence de valeur, la différence est que NULL ne s'applique qu'aux pointeurs en C alors qu'en Swift n'importe quel type peut être rendu optionnel.

### Classes

En déclarant une classe, on crée un nouveau type auquel sont associées des variables (nommées propriétés) et des fonctions (nommées méthodes).
Voici un exemple de création de classe en Swift, celle-ci stocke des informations de base sur un animal (nom et nombre de pattes) et peut retourner une chaîne de caractères décrivant cet animal (avec la fonction simpleDescription) :
Les variables et constantes d'une classe sont appelées propriétés ; ses fonctions sont appelées méthodes. Toutes les propriétés non optionnelles doivent avoir une valeur au moment de l'initialisation.