Swift (langage d'Apple)

Un article de Wikipédia, l'encyclopédie libre.
Sauter à la navigation Sauter à la recherche
Page d'aide sur l'homonymie Pour les articles homonymes, voir Swift.

Swift
Logo.

Date de première version 2 juin 2014
Paradigme Orienté objet, procédural, impératif, fonctionnel
Développeur Apple
Dernière version 5.0 ()
Version en développement 5.1
Influencé par Objective-C, C♯, CLU, Haskell, Python, Racket, Ruby, Rust, Scala et langage D[1]
Système d'exploitation iOS, macOS, watchOS, tvOS, Linux, (support non-officiel pour Android et Windows)
Licence Apache-2.0[2]Voir et modifier les données sur Wikidata
Site web https://swift.org/
Extension de fichier swiftVoir et modifier les données sur Wikidata

Swift est un langage de programmation objet compilé, multi-paradigmes ayant pour objectif d'être simple, hautes performances 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 activement à son développement. Swift est officiellement supporté sur les systèmes d'exploitation Linux Ubuntu, iOS, macOS, watchOS et tvOS. Un support non officiel (géré par la communauté) existe sur d'autres plateformes Linux telles que Debian et Fedora.

Un manuel officiel en anglais est disponible en ligne[3].

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[modifier | modifier le code]

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[4] et celui-ci sera effectif en décembre de la même année. La version 3.0 de Swift est, elle, lancée en septembre 2016[5]. La version 4.0 est disponible depuis le 19 septembre 2017 et se concentre principalement sur la stabilité de la syntaxe du code source[6]. La version 5.0 est disponible depuis le 25 mars 2019 et apporte principalement la stabilisation de l'ABI.

Réception[modifier | modifier le code]

Swift a été bien accueilli par les développeurs habitués aux technologies d'Apple[7]. Ceux-ci l'ont notamment jugé plus simple que l'Objective-C, permettant d'en faire autant en moins de lignes.

Certains développeurs ont affirmé qu'ils développeraient de nouveaux logiciels entièrement en Swift, c'est par exemple le cas 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[8].

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)[8]. En juillet 2014, Swift passe à la 16e place de ce classement[9].

Le livre The Swift Programming Language avait déjà été téléchargé plus de 370 000 fois le lendemain de l'annonce de Swift à la WWDC 2014[10].

Réactivité d'Apple face aux retours des développeurs[modifier | modifier le code]

Apple affirme clairement prendre en compte les retours des développeurs pour améliorer Swift[11].

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[12]. Le 21 juillet 2014, Apple ajoute ceux-ci à Swift.

Mi-juillet 2014, Apple ouvre sur son site web un blog consacré à Swift[13] 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[modifier | modifier le code]

Le 8 juin 2015, Apple annonce que le code du compilateur et des bibliothèques standard seront distribués sous une licence open source[14].

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

Depuis le 3 décembre 2015, Swift est désormais disponible sous licence Apache 2.0[16]. Le code ouvert inclut le compilateur, les bibliothèques standard du langage ainsi qu'un gestionnaire de paquets[17].

Syntaxe du langage[modifier | modifier le code]

Variables et constantes[modifier | modifier le code]

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

Variables[modifier | modifier le code]

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[modifier | modifier le code]

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[modifier | modifier le code]

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[modifier | modifier le code]

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

Condition if[modifier | modifier le code]

1 if age >= 18
2 {
3     print("Vous êtes majeur")
4 }
5 else
6 {
7     print("Vous êtes mineur")
8 }

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[modifier | modifier le code]

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[modifier | modifier le code]

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 trough" de C, on peut utiliser l'instruction falltrough.

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 d'un contexte qui lui est propre.


Boucles[modifier | modifier le code]

Il existe plusieurs types de boucle en Swift, notamment while, repeat while et for in. Tout comme les conditions, les conditions de boucle 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 jugées inutiles comparées aux boucles for in[18].

Boucles while[modifier | modifier le code]

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[modifier | modifier le code]

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 est de la forme for élément in séquenceélément correspond au nom de la constante qui, à chaque tour de boucle, se verra affecter une valeur d'un élément de séquenceséquence peut être un tableau, un dictionnaire ou de 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 tels 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[modifier | modifier le code]

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[modifier | modifier le code]

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 aie 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 + 10

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 else[modifier | modifier le code]

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 ??[modifier | modifier le code]

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é[modifier | modifier le code]

Dans certains cas, on a 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[modifier | modifier le code]

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[modifier | modifier le code]

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 basiques 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/constantes d'une classe sont appelées propriétés, les fonctions sont appelées méthodes. Toutes les propriétés non optionnelles doivent avoir une valeur au moment de l'initialisation.

Annexes[modifier | modifier le code]

Articles connexes[modifier | modifier le code]

Liens externes[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. (en) « Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog - », Apple Developer (consulté le 24 octobre 2014) : « Swift borrows a clever feature from the D language: these identifiers expand to the location of the caller when evaluated in a default argument list. »
  2. « https://github.com/apple/swift/blob/master/LICENSE.txt »
  3. https://docs.swift.org manuel
  4. « WWDC 2015 : Swift devient open source, Apple va publier le code source de son langage de programmation », Developpez.com,‎ (lire en ligne, consulté le 16 juin 2017)
  5. vincent@nextinpact.com, « Développement : Apple publie les versions finales de Swift 3.0 et Xcode 8 », blog,‎ (lire en ligne, consulté le 16 juin 2017)
  6. (en) Apple Inc., « Swift 4.0 Released! », Swift.org,‎ (lire en ligne, consulté le 26 novembre 2018)
  7. « WWDC 2014 : le verdict (favorable) des développeurs » [archive du ].
  8. a et b « Swift, un langage déjà courant ».
  9. (en) « TIOBE Index for July 2014 ».
  10. (en) « Introduction to Swift ».
  11. (en) « [LLVMdev] [cfe-dev] [ADVERTISEMENT] open positions in Apple's Swift compiler team ».
  12. (en) « Does Swift have access modifiers? ».
  13. (en-US) « Swift Blog - Apple Developer », sur developer.apple.com (consulté le 15 juillet 2019)
  14. (en) « Apple open sources Swift », sur Ars Technica, .
  15. (en) « Swift 2.0 - Swift Blog », sur developer.apple.com.
  16. https://github.com/apple/swift/commit/39dcf401fab5eaab848a0a44fa1b2d4cb8f1d8ea#diff-61e0bdf7e1b43c5c93d9488b22e04170.
  17. « Swift Package Manager », sur Swift.org.
  18. (en) Remove C-style for-loops with conditions and incrementers.