352 votes

Quelle est la différence entre `let` et `var` en swift ?

Quelle est la différence entre let et var dans le langage Swift d'Apple ?

D'après ce que j'ai compris, il s'agit d'un langage compilé, mais il ne vérifie pas le type au moment de la compilation. Cela me rend confus. Comment le compilateur sait-il qu'il y a une erreur de type ? Si le compilateur ne vérifie pas le type, n'est-ce pas un problème avec l'environnement de production ?

45 votes

Let est pour les constantes, var est pour les variables.

2 votes

@Edward Que voulez-vous dire par "pas de vérification de type à la compilation" ? Pour autant que je puisse dire, c'est statiquement typé, mais les types sont déduits si le compilateur peut le découvrir par lui-même. Mais je n'en suis qu'à la page 25... ;-)

5 votes

Cette question est dans le sujet, mais elle est mal formulée. Il y a au moins 2 questions (i) différence entre let et var ; (ii) type safe vs type infer. En outre, lorsque l'affiche a mentionné phase de production il voulait vraiment dire au moment de l'exécution.

434voto

jm666 Points 17312

Le site let Le mot-clé définit une constante :

let theAnswer = 42

Le site theAnswer ne peut être modifié par la suite. C'est pourquoi tout ce qui weak ne peut pas être écrit en utilisant let . Ils doivent changement pendant l'exécution et vous devez utiliser var à la place.

Le site var définit une variable ordinaire.

Ce qui est intéressant :

La valeur d'une constante n'a pas besoin d'être connu au moment de la compilation mais vous devez attribuer la valeur une seule fois.

Une autre caractéristique étrange :

Vous pouvez utiliser presque tous les caractères que vous voulez pour les noms des y compris les caractères Unicode :

let  = "dogcow"

Extraits de : Apple Inc. "Le langage de programmation Swift". iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329

EDIT

Parce que les commentaires demandent d'ajouter d'autres faits à la réponse, la conversion en réponse de la communauté wiki . N'hésitez pas à modifier la réponse pour l'améliorer.

1 votes

C et C++ permettent également les identifiants Unicode, via les UCN. Si le compilateur prend en charge un encodage source Unicode, vous pouvez simplement utiliser les caractères Unicode directement. Par exemple auto = "dogcow"; fonctionne en C++ pour clang.

139 votes

@bames53 ok, je ne suis pas sûr que je veuille déboguer un programme comme celui-ci : if === { = } :) ;)

0 votes

S'applique-t-il à REPL ? Parce que vous pouvez réaffecter la constante dans REPL.

34voto

Krzak Points 46

Selon Le livre sur le langage de programmation Swift

Comme le C, Swift utilise des variables pour stocker et se référer à aux valeurs par un nom d'identification. Swift fait également un usage intensif de variables dont dont les valeurs ne peuvent pas être modifiées. On les appelle des constantes et elles sont beaucoup plus plus puissantes que les constantes en C.

Les deux sites var et let sont références donc let est un référence constante . L'utilisation de types fondamentaux ne montre pas vraiment comment let est différent de const . La différence se fait sentir lorsqu'on l'utilise avec des instances de classe (types de référence) :

class CTest
{
    var str : String = ""
}

let letTest = CTest()
letTest.str = "test" // OK

letTest.str = "another test" // Still OK

//letTest = CTest() // Error

var varTest1 = CTest()
var varTest2 = CTest()
var varTest3 = CTest()

varTest1.str = "var 1"
varTest2.str = "var 2"
varTest3 = varTest1
varTest1.str = "var 3"

varTest3.str // "var 3"

1 votes

Cette terminologie est totalement erronée... Toutes les références sont en effet des références constantes. Il n'y a pas de concept de "const ref". Une fois liée, une référence est toujours liée à la même adresse mémoire et ne peut pas être modifiée ou "dé-saisie". Je pense que vous voulez dire que var est un "pointeur" et que let est un "pointeur constant".

0 votes

@AyBayBay Bien que ce que vous écrivez soit correct en C++ par exemple, je pense que l'extrait ci-dessus prouve que ce n'est pas le cas en Swift. Les pointeurs permettraient l'arithmétique des pointeurs et l'accès direct à la mémoire, ce qui, encore une fois, n'est pas le cas ici. -- Edit : Je n'ai trouvé aucune preuve que Toutes les références sont en effet des références constantes est vrai pour tous les langages de programmation.

0 votes

BTW selon Wikipedia les pointeurs sont des références

17voto

atxe Points 2354

let est utilisé pour définir les constantes et var pour définir les variables.

8voto

Luc-Olivier Points 172

Il est peut-être préférable d'exprimer cette différence par la notion de Mutabilité / Immutabilité qui est le paradigme correct de la changeabilité des valeurs et des instances dans l'espace des objets qui est plus large que les seules notions habituelles de "constant / variable". En outre, cette notion est plus proche de l'approche de l'Objective C.

2 types de données : le type de valeur et le type de référence.

Dans le contexte des types de valeurs :

let" définit une valeur constante (immuable). var " définit une valeur modifiable (mutable).

let aInt = 1   //< aInt is not changeable

var aInt = 1   //< aInt can be changed

Dans le contexte des types de référence :

L'étiquette d'une donnée n'est pas la valeur mais la référence à une valeur.

if aPerson = Person(name:Foo, first:Bar)

aPerson ne contient pas les données de cette personne mais la référence aux données de cette personne.

let aPerson = Person(name:Foo, first:Bar)
               //< data of aPerson are changeable, not the reference

var aPerson = Person(name:Foo, first:Bar)
               //< both reference and data are changeable.

eg :

var aPersonA = Person(name:A, first: a)
var aPersonB = Person(name:B, first: b)

aPersonA = aPersonB

aPersonA now refers to Person(name:B, first: b)

et

let aPersonA = Person(name:A, first: a)
let aPersonB = Person(name:B, first: b)

let aPersonA = aPersonB // won't compile

mais

let aPersonA = Person(name:A, first: a)

aPersonA.name = "B" // will compile

2 votes

Mais si aPerson a des paramètres, vous pouvez modifier ses propriétés, n'est-ce pas ? let ne fait pas le Person immuable.

5 votes

L'immuabilité ? C'est inpossible ! Certainement contre-indiqué. Je pense que le mot que vous cherchez est peut-être "immuabilité" :-)

6voto

mr_sd Points 21

Le site

Déclarer des constantes et des variables de la documentation du langage de programmation Swift précise ce qui suit :

Vous déclarez les constantes avec le mot clé let et les variables avec le mot clé var.

Assurez-vous de bien comprendre comment cela fonctionne pour les types de référence. Contrairement aux types de valeur, les propriétés sous-jacentes de l'objet peuvent changer même si l'instance d'un type de référence est déclarée comme une constante. Voir le Les classes sont des types de référence de la documentation, et regardez l'exemple dans lequel ils modifient la propriété frameRate.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X