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.

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  à la WWDC 2014.

En , 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 . La version 4.0 est disponible depuis le  et se concentre principalement sur la stabilité de la syntaxe du code source. La version 5.0 est disponible depuis le  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). En , Swift était passé à la  de ce classement.

Le livre  avait été téléchargé plus de  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 (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 , Apple ajoute ceux-ci à Swift.

Mi-, 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 , Apple annonce que le code du compilateur et des bibliothèques standard seront distribués sous une licence .

Apple affirme que des contributions de la communauté seront acceptées et encouragées.

Depuis le , 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.
var entierImplicite = 70
var doubleImplicite = 70.0
var floatExplicite: Float = 70 // On précise ici explicitement le type de la variable

Constantes 
Les constantes sont à utiliser pour toute valeur qui restera inchangée lors du programme.
let pi = 3.14159
let deuxPi = 2 * pi

Noms des variables 
Il est possible de nommer une variable avec à peu près n'importe quel caractère Unicode, par exemple :
var fréquentationTourEiffelEn2011 = 7100000
let π = 3.14159 
let 你好 = "你好世界"
let سعيد" = فرح"
let 😢 = "Triste"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 
if age >= 18 {
    print("Vous êtes majeur")
} else {
    print("Vous êtes mineur")
}
Il est également possible d'utiliser else if :
if age >= 18 {
    print("Vous êtes un adulte")
} else if age >= 11 {
    print("Vous êtes un adolescent")
} else {
    print("Vous êtes un enfant")
}

Condition switch 
switch nombreDeCôtés {
    case 3:
        print("Triangle")
    case 4:
        print("Quadrilatère")
    case 5:
        print("Pentagone")
    case 6:
        print("Hexagone")
    default:
        print("Nom indisponible pour votre figure")
}
En Swift, pour des raisons de sureté, 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 :
switch lettre {
    case "a","e","i","o","u","y":
        print("Voyelle")
    case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "z":
        print("Consonne")
    default:
        print("Votre caractère n'est pas listé")
}

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.// Exemple d'une boucle affichant les nombres de 0 à 99
var i = 0
while i < 100 {
    print(i)
    i += 1
}

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 :
let prénoms = ["Victor", "Emmanuel", "Victoria"]
for prénom in prénoms {
    print("Bonjour, \(prénom) !")
}

Serait écrit ainsi à l'aide de «while» :
let prénoms = ["Victor", "Emmanuel", "Victoria"]
var i = 0
while i < prénoms.count {
    print("Bonjour, \(prénoms[i]) !")
    i += 1
}

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é « ... » :for i in 1...10 {
    print("i = \(i)")
}

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.// Donnons nous la fonction lancerDé() qui retourne un entier aléatoire en 1 et 6

var valeurDé1: Int
var valeurDé2: Int

repeat {
    valeurDé1 = lancerDé()
    valeurDé2 = lancerDé()
    print("\(valeurDé1) et \(valeurDé2)") /
} while !(valeurDé1 == 6 && valeurDé2 == 6) // Tant qu'on a pas un double six

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 :
let entierOptionel = Int(chaineDeCaractères)
Ici, entierOptionel sera de type Int?, c'est-à-dire un entier optionnel, en effet, il se peut que notre chaine 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 chaine vers un entier, et entierOptionel n'aura donc pas de valeur c'est-à-dire qu'il sera nil. Dans le cas où la chaine 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 :// Erreur: Value of optional type 'Int?' must be unwrapped to a value of type 'Int'
let résultat = entierOptionel + 10En 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 :
if let valeur = entierOptionel {
     print(valeur + 10)
} else {
    print("entierOptionel n'a pas de valeur")
}

Opérateur ?? 
L'opérateur ?? permet un grand gain d'espace et de lisibilité dans certains cas, ainsi, le code suivant :if let nom = nomAnimalDeCompagnie {
    print(nom)
}
else {
    print("Aucun nom précisé pour votre animal.")
}Est remplaçable par une seule ligne:print(nomAnimalDeCompagnie ?? "Aucun nom précisé pour votre animal.")

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:// urlDeWikipedia sera ici de type URL au lieu de URL?
let urlDeWikipedia = URL(string: "http://fr.wikipedia.org/")!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 chaine de caractères décrivant cet animal (avec la fonction simpleDescription) :
class Animal {
   // Exemple de propriétés
   var pattes: Int
   var nom: String

   // Fonction d'initialisation 
   init(nomEspece: String, nombreDePattes: Int) {
      self.nom = nomEspece
      self.pattes = nombreDePattes
   }
    
   // Exemple de méthode
   func simpleDescription() -> String {
      return "Cet animal s'appelle \(nom) et il a \(pattes) pattes."
   }
}
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.

Annexes

Articles connexes 
 Cocoa
 Inférence de types
 Objective-C
 Xcode

Liens externes 
  Site d'Apple sur Swift
  Sur le site développeur d'Apple

Notes et références 

Langage de programmation
Langage orienté objet
Apple
Nouveauté en 2014
Logiciel propriétaire