Le langage Swift, successeur à Objective-C

Pour remplacer Objective-C, Apple a conçu un nouveau langage qui veut tirer parti des avancées dans le domaine des langages, et qui produit des applications plus rapides.

Le langage a été influencé selon les auteurs par C#, Objective-C, Haskell entre autres (voir la description de la syntaxe plus loin). En utilisant un rétroscope peut-être. Il se base cependant sur les outils LLVM et produit du code natif. Donc une syntaxe très vieille avec un backend moderne.

Tom Swift

La comparaison avec le langage Go vient naturellement à l'esprit puisque Swift veut succéder à Objective-C tandis que Go voulait faire de même envers C++. Swift reprend quelques éléments de syntaxe de Go:

Il diffère cependant de Go sur de nombreux points essentiels, notamment l'utilisation de l'héritage quand Go utilise la composition. La concurrence est une bibliothèque pour Swift, la généricité manque à Go. Go en outre est un langage minimaliste (une seule syntaxe de boucle) tandis que Swift vise à intégrer tous les éléments possibles a chaque aspect du langage.

Swift était initialement propriétaire mais le 3 décembre 2015 Apple a publié le code source (compilateur + bibliothèque). Il requiert XCode pour produire un programme. Il est fourni d'emblée avec une documentation étendue, un tutoriel complet, et un playground comme TypeScript, pour tester le code. En fait sa conception a démarré en 2010, cela a laissé quatre ans pour préparer sa distribution publique.

Caractéristiques du langage...

Description de la syntaxe

Afficher Salut le Monde!

print("Salut le Monde!") 

On peut insérer des variables avec l'opérateur \() qui au contraire du $ de PHP à l'avantage de délimiter la fin du nom de la variable.

Type défini par inférence

Comme dans Go, Julia et de nombreux langages de script.

var x = 10

La valeur entière assignée donne à x le type int. Le type ne peut changer comme ce serait le cas avec un langage dynamique.

Type explicite

C'est devenu courant, les variables sont définies par var et le type peut être précisé en option, mais pour autant les variables ne sont pas dynamiques comme en Julia.

var s = "hello" : string

Constante

Les constantes sont définies par let. On ne voit pas l'avantage sur const et le mot let à un rôle différent dans d'autres langages comme JavaScript ou dans BASIC qui a initialement utilisé ce mot pour l'assignement en général.

let x = 10

Tuple

Un tuple peut se décomposer automatiquement et ainsi fournir des retours multiples aux fonctions ou des assignements destructurés.

let tuple1 = (1000, "hello") 
let (x, y) = tuple1

x prend la valeur 1000 et y la valeur "hello".

Structure de contrôle if

Reprend le principe de Go: pas de parenthèses, mais les accolades obligatoires:

if x == 10 {  
    print("égal à 10")
} else if x < 10 {
    print("moins que 10")
} else {
    print("plus de 10")
}

Boucle for

Le for in sur un intervalle ressemble à celui de Ruby et Scriptol. Swift utilise ..< pour un intervalle exclusif, ... pour un intervalle inclusif. Ruby utilise ... pour un intervalle exclusif et Scriptol utilise .. et --.
Les doubles points sont utilisés en typographie pour représenter un intervalle, ce qui a été aussi repris par Bash, alors que trois points de suspension représentent une suite indéfinie.
Python reprend le symbolisme d'ALGOL 68.

for var i in 1 ... 10 {
    print(i)
} 

Le format de C était aussi implémenté pour permettre le choix de l'incrément. On aurait pu plutôt ajouter une option step comme en BASIC. Il a été supprimé dans Swift 3.

For in fonctionne sur une collection, ce qui est maintenant implémenté dans tous les langages, même C++.

for x in liste {
    print("Item \(x)")
} 

L'exemple classique pour afficher les lettres d'une chaîne est aussi simple en Swift qu'en Python.

for c in "demo" {
  print(c)
} 

On utilise un tuple pour obtenir les couples clé-valeur dans un dictionnaire.

let liste = [ "a" : "apple", "b" : "orange", "c" : "fraise" ] 

for (k , v) in liste {
    print("\(k) = \(v))
}

While et repeat while : La mode rétro du language BASIC

Pour une raison quelconque, la boucle do ... while de la version 1, héritée de C (1972) est remplacée par repeat ... while qui ressemble au repeat until du langage BASIC (1964).

while x <  y {

}
repeat {

} while x < y

Switch

Il résoud la question des cas multiples en les séparant par une virgule. Comme Go il peut aussi utiliser le mot réservé fallthrough pour enchaîner les clauses. Les intervalles sont possibles comme en Scriptol.
On peut aussi utiliser des tuples dans les case mais pour les comparer à un tuple initial.

switch x {
case 1:
    print("1")
case 2, 3, 4:
    print("entre 2 et 4")
case 5 ... 10:
    print("entre 5 et 10")
default :
    print("autre valeur")
}

Les clauses break et continue associées à un label dans un switch inséré dans une boucle while permettent soit de sauter à une instruction soit de passer à l'itération suivante.

Pattern matching

Les case de la structure switch peuvent comporter des conditions avec la clause where. Le principe remonte au langage SNOBOL (1962). Une extension de pattern matching à été ajoutée à Python, nommée SnoPy.

switch x {
  case y where y < 10
  case z where x + z = 20
}

Fonction

La syntaxe est inversée par rapport à C, comme c'est la mode avec les nouveaux langages. Elle supporte les retours multiples, les paramètres par défaut. On peut imbriquer des fonctions dans une autre fonction, qui sont inaccessibles hors de celle-ci.

func mafonction(s : String) -> String {
   s += "suffixe"
   return s
}

Multiples retours sous forme de tuple. Il faut indiquer le nom de la variable à la fois dans l'en-tête et dans l'instruction de retour.

func pair(x : Int, y : Int) -> (a : Int, b : Int) {
  a = x * 2
  b = y + 5
  return(a, b)
} 

Paramètres variadiques avec le symbole des trois points, inspiré de C, un symbolisme qui est pertinent ici.

func listing(x : Int ...) -> Int {
  var a, b, c 
  (a, b, c) = x
}
listing(5, 10, 20) 

L'argument x est en fait un tableau mais cela ne se voit pas à l'appel de la fonction.

Classes et héritage

Des classes avec héritage simple et interfaces multiples, comme Java, C#. Le constructeur s'appelle init plutôt que constructor ou plutôt que reprendre le nom que la classe, peut-être parce qu'il est plus général.

class Vehicle {
   var speed : Int
   var name : String
   init(s) {
      speed = s
   }
   func getname() {
      return name
  }
}

class Car : Vehicle {
   var passengers : Int
}

Protocol

Les interfaces sont appelées protocol pour être original. Elles peuvent être typées ou génériques. Le principe est inspiré par C# avec les getters et setters: les mots get et set précisent si on peut lire ou assigner une propriété.

protocol moninterface {
  var i: Int { get set }
  var name: String { get }
}

On hérite une interface (un protocole) comme une classe:

class car : moninterface {
  var name : String = "hello"
} 

Extensions

Les traits sont ici appelés des extensions. Cela permet d'ajouter des méthodes à des classes existantes. On voit ici l'influence de Rust: changer le nom des éléments habituels aux langages leur donne un air de nouveauté!

extension tentimes {
  var up : Int { return self * 10 }
} 

var ten : Int = 10
print(ten.tentimes)

Qui utilisera Swift?

L'adoption de Swift ne devrait pas poser de problème auprès des développeurs pour mobiles Apple. Ils utilisent déjà un langage particulier à la plateforme, Objective C, et migrer pour une version plus moderne et compatible ne peut que leur simplifier la vie.
La production de bitcode LLVM éventuelle, pourrait donner accès à Android seulement si l'application n'utilise pas le framework d'Apple et si XCode n'est plus nécessaire. La même restriction s'applique pour les autres systèmes d'exploitation.
Les auteurs développent aussi le langage pour un usage coté serveur et plusieurs frameworks existent pour cet usage. Des composants utiles sont implémentés dans le projet Open Swift. Mais en 2017, Swift n'est pas prêt pour un usage hors mobile et comme chaque nouvelle version ajoute des incompatibilités avec la précédente, il vaut mieux ne pas l'utiliser avant qu'il ne soit complètement stable.

Site:

Langages de programmation et de données Asm.js - Basic - C - C++ - C# - Dart - Eiffel - Go - Java - JavaScript - Julia - Pascal - PHP - Python - Ruby - Scala - Scriptol - TypeScript - HTML - Wasm - XML - XAML - SQL