plus-minus
Langage en constante évolution depuis son lancement le 2 juin 2014 par Apple, Swift vient de passer en version 2.2. L’un des changements les plus marquants du langage à cette occasion est la dépréciation des opérateurs d’incrémentation et décrémentation préfixe ou suffixe ++
et --
.
Cette modification fait suite à une proposition de Chris Lattner qui est pourtant le créateur Swift. L’argument principal avancé par Chris Lattner pour supprimer ces opérateurs historiques est qu’ils généraient trop de confusion dans le résultat attendu selon leur utilisation avant ou après la variable à modifier (voir Remove the ++ and — operators).
Voici un exemple d’utilisation des opérateurs ++
et --
qui était parfaitement valide avec Swift 2.1:
Avec Swift 2.2, l’utilisation des opérateurs ++
et --
génère désormais un message d’alerte: '++ / --' is deprecated: it will be removed in Swift 3
. Avec Swift 3, prévu avant la fin de l’année, l’utilisation de ces opérateurs ne sera plus du tout autorisée et générera une erreur de compilation. Aussi, Apple recommande désormais d’utiliser les opérateurs +=
et -+
.
Int
A l’annonce de ce changement dans le langage, certaines personnes se sont demandé s’il était possible de réimplémenter ces opérateurs. Si une telle réimplémentation dans un projet réel n’est pas recommandée, elle constitue cependant un bon excercice pour découvrir certains concepts avancés du langage.
La solution la plus simple pour cela fait appel à defer
, inout
, prefix operator
et postfix operator
. Ainsi, la première étape consiste à redéfinir chacun des opérateurs:
Il faut ensuite implémenter les fonctions liées à ces opérateurs:
Ici, le paramètre a
étant de type Int
– c’est à dire un value type
et non un reference type
– il faut lui adjoindre le mot-clé inout
afin de pouvoir modifier la valeur du paramètre à l’extérieur de la fonction.
Pour les opérateurs d’incrémentation et décrémentation suffixe, il faut retourner la valeur du paramètre puis augmenter immédiatement sa valeur grâce à defer
.
categories & tags
In Geek Lifestyle