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 2014
Paradigme Orienté objet, Procédural, Impératif
Développeur Apple
Dernière version 4.1 ()
Version en développement 5.0 ()
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://developer.apple.com/swift/
Extension de fichier swiftVoir et modifier les données sur Wikidata

Swift est un langage de programmation compilé multi-paradigmes développé par la société Apple. Il est destiné à la programmation d'applications sur les systèmes d'exploitation iOS, macOS, watchOS, tvOS ainsi que Linux.

Il a été présenté à la WWDC 2014[3]. Il est conçu pour coexister avec l'Objective-C, langage actuel de programmation pour les systèmes d'exploitation d'Apple, et le C. Il est compilé avec le compilateur LLVM. Un manuel de 500 pages[4] a été dévoilé à la WWDC 2014.

Historique[modifier | modifier le code]

Le développement de Swift a été lancé en 2010 par Chris Lattner et prend ses sources dans de nombreux langages de programmation tels que 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[5] 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[6]. La version 4.0 devrait être disponible en automne 2017[7] et devrait se concentrer sur la stabilité du code source.

The Swift Programming Language est un manuel de 500 pages disponible gratuitement[8] sur iBookStore permettant de décrire les fonctionnalités du langage.

Réception[modifier | modifier le code]

Swift a été bien accueilli par les développeurs habitués aux technologies d'Apple[9]. 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[10].

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

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[12].

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[13].

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

Mi-juillet 2014, Apple ouvre sur son site web un blog dédié à Swift où les ingénieurs d'Apple parleront 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[15].

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

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

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

Optionnels[modifier | modifier le code]

Les optionnels sont un type spécial de variable à utiliser lorsqu'une variable est susceptible de n'avoir aucune valeur.

var nomAnimalDeCompagnie: String? // Pour créer un optional, on fait suivre le type de la variable d'un point d'interrogation
var ageAnimalDeCompagnie: Int? = 4 // Il est tout à fait possible d'assigner une valeur à un optional dès sa création

On donne ici à nos variables un type optional car, dans notre exemple, il est possible qu'une personne n'ait pas d'animal de compagnie, et donc qu'il n'y ait aucune valeur pour ces variables.

Pour utiliser la valeur d'une variable de type optional, on vérifie si la variable contient une valeur ou pas ; si celle-ci a une valeur, on doit unwraper (ou déballer) celle-ci en la suivant d'un point d'exclamation.

if nomAnimalDeCompagnie != nil { // Si la variable a une valeur
     print(nomAnimalDeCompagnie!) // On unwrap l'optional et on affiche celui-ci dans la console
} else { // Si aucune valeur n'a été attribuée à la variable
     print("L'utilisateur n'a pas spécifié d'animal de compagnie")
}

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]

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[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.

Condition if let[modifier | modifier le code]

La condition if let est un type de condition spécifique à Swift permettant de simplifier le déballage des optionnels ; grâce à cette condition, si un optionnel a une valeur, on attribue automatiquement cette valeur à une constante qui sera alors accessible dans le contexte des accolades de la condition if let.

var nomPossibleAnimalDeCompagnie: String? = "Capie"

if let nomAnimalDeCompagnie = nomPossibleAnimalDeCompagnie { // Création de la constante à partir de la valeur de l'optional
     // La constante nomAnimalDeCompagnie est accessible uniquement entre les accolades de la condition if let
     print(nomAnimalDeCompagnie) // Plus besoin d'unwraper l'optional
} else {
     print("Aucun nom spécifié pour l'animal de compagnie")
}

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[19].

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 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 execution 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

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é (le risque d'une boucle infinie est quasiment nul) 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, un ensemble ou plus généralement tout type conforme au protocole Sequence.

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.

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. (en) « Apple announces Swift, a new programming language for iOS ».
  4. (en) The Swift Programming Language, itunes.apple.com.
  5. « WWDC 2015 : Swift devient open source, Apple va publier le code source de son langage de programmation », Developpez.com,‎ (lire en ligne)
  6. vincent@nextinpact.com, « Développement : Apple publie les versions finales de Swift 3.0 et Xcode 8 », blog,‎ (lire en ligne)
  7. (en) Apple Inc., « Swift 4 Release Process », Swift.org,‎ (lire en ligne)
  8. (en) « The Swift Programming Language (Swift 3) de Apple Inc. sur iBooks », sur iBooks (consulté le 21 octobre 2016).
  9. « WWDC 2014 : le verdict (favorable) des développeurs » [archive du ].
  10. a et b « Swift, un langage déjà courant ».
  11. (en) « TIOBE Index for July 2014 ».
  12. (en) « Introduction to Swift ».
  13. (en) « [LLVMdev] [cfe-dev] [ADVERTISEMENT] open positions in Apple's Swift compiler team ».
  14. (en) « Does Swift have access modifiers? ».
  15. (en) « Apple open sources Swift », sur Ars Technica, .
  16. (en) « Swift 2.0 - Swift Blog », sur developer.apple.com.
  17. https://github.com/apple/swift/commit/39dcf401fab5eaab848a0a44fa1b2d4cb8f1d8ea#diff-61e0bdf7e1b43c5c93d9488b22e04170.
  18. « Swift Package Manager », sur Swift.org.
  19. (en) Remove C-style for-loops with conditions and incrementers.