Quelle est la différence entre let
et var
dans le langage Swift d'Apple?
À ma connaissance, 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 connaît-il l'erreur de type? Si le compilateur ne vérifie pas le type, n'est-ce pas un problème avec l'environnement de production?
Réponses:
Le
let
mot-clé définit une constante:Le
theAnswer
ne peut pas être changé par la suite. C'est pourquoi rienweak
ne peut être écrit en utilisantlet
. Ils doivent changer pendant l'exécution et vous devez utiliser à lavar
place.Le
var
définit une variable ordinaire.Ce qui est intéressant:
Une autre caractéristique étrange:
Extraits de: Apple Inc. «The Swift Programming Language». iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
ÉDITER
Parce que les commentaires demandent d'ajouter d'autres faits à la réponse, convertissant cela en réponse wiki communautaire . N'hésitez pas à modifier la réponse pour l'améliorer.
la source
auto 🐶🐮 = "dogcow";
fonctionne en C ++ pour clang.if 😍 === 💝 { 💔 = ♠︎ }
:);)Selon le livre du langage de programmation Swift
Les deux
var
etlet
sont des références ,let
est donc une référence const . L'utilisation de types fondamentaux ne montre pas vraiment en quoilet
est différent deconst
. La différence vient de son utilisation avec des instances de classe (types de référence):la source
var
etlet
n'ont rien à voir avec le fait que l'identifiant lié soit ou non une référence. Si le type est unstruct
type, il s'agit conceptuellement d'une valeur. Si le type est unclass
c'est conceptuellement une référence et la référence est une constante silet
est utilisée. SiCTest
c'était une structure, aucune de vosletTest
affectations ne fonctionnerait.struct
type de valeur, il n'y a rien de conceptuel à ce sujet. Le même avecclass
- type de référence. Lorsque vous modifiez un type de valeur, vous créez une nouvelle instance de ce type. developer.apple.com/swift/blog/?id=10 Donc, évidemment, vous ne pouvez pas modifier les champs / propriétéslet
liés au type de valeur.let
est utilisé pour définir des constantes etvar
définir des variables.la source
Il est peut-être préférable d'énoncer cette différence par la notion de mutabilité / immutabilité qui est le paradigme correct des valeurs et de la variabilité des instances dans l'espace des objets qui est plus grande que les seules notions habituelles "constantes / variables". Et en plus c'est plus proche de l'approche Objectif C.
2 types de données: type de valeur et type de référence.
Dans le contexte des types de valeur:
'let' définit une valeur constante (indomptable). 'var' définit une valeur modifiable (mutable).
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.
si aPerson = Person (nom: Foo, first: Bar)
aPerson ne contient pas les données de cette personne mais la référence aux données de cette personne.
la source
aPerson
a des setters vous pouvez modifier ses propriétés non? donclet
ça ne fait pas l'Person
immuable.le
La section Déclaration des constantes et variables de la documentation du langage de programmation Swift spécifie les éléments suivants:
Assurez-vous de 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 malgré le fait qu'une instance d'un type de référence soit déclarée comme constante. Consultez la section Les classes sont des types de référence de la documentation et regardez l'exemple où elles modifient la propriété frameRate.
la source
Très simple:
let
est constant.var
est dynamique.Un peu de description:
let
crée une constante. (un peu comme unNSString
). Vous ne pouvez pas modifier sa valeur une fois que vous l'avez définie. Vous pouvez toujours l'ajouter à d'autres choses et créer de nouvelles variables.var
crée une variable. (un peu commeNSMutableString
) pour que vous puissiez en changer la valeur. Mais cela a été répondu plusieurs fois.la source
let
définit une "constante". Sa valeur est définie une seule fois, mais pas nécessairement lorsque vous la déclarez. Par exemple, vous utilisezlet
pour définir une propriété dans une classe qui doit être définie lors de l'initialisation:Avec cette configuration, il n'est pas valide de l'attribuer à
firstName
oulastName
après avoir appelé (par exemple)Person(first:"Malcolm", last:"Reynolds")
pour créer unePerson
instance.Vous devez définir un type pour toutes les variables (
let
ouvar
) au moment de la compilation, et tout code qui tente de définir une variable ne peut utiliser que ce type (ou un sous-type). Vous pouvez affecter une valeur au moment de l'exécution, mais son type doit être connu au moment de la compilation.la source
let
-constant
var
-variable
[Constante vs variable]
[Struct vs classe]
Le doc officiel docs.swift.org dit
Cette terminologie décrit en fait un mécanisme de réaffectation
Mutabilité - modifiable - l'état de l'objet peut être modifié après sa création
Valeur et type de référence [À propos]
Valeur (Struct, Enum)
Les Swift
struct
peuvent changer leur statut de mutabilité:let
+struct
=immutable
= constante de valeurElle ne peut pas être réaffectée ou modifiée
var
+struct
=mutable
Il peut être réaffecté ou modifié
Type de référence (classe)
Les Swift
classes
sontmutable
un prieurélet
+class
= constante d'adresseElle ne peut pas être réaffectée et peut être modifiée
var
+class
Il peut être réaffecté ou modifié
mutating
- Fonctions de Structures MutantesVous pouvez marquer la méthode d' une structure comme
mutating
var
+struct
inout
Modification de la structure à l'intérieur d'une fonctionVous pouvez marquer le paramètre d'une fonction (qui est struct) comme
inout
Depuis
struct
un type de valeur, il est passé par valeur car une fonction de résultat récupérera une copie. Si vous marquez un paramètre enstruct
tant queinout
, cela signifie que ce paramètre devientvar
et vous pouvez modifier un état destruct
et ces modifications seront visibles en dehors de la portée de la fonctionla source
Une autre différence, que j'ai rencontrée dans d'autres langages pour les constantes, est: ne peut pas initialiser la constante (let) pour plus tard , devrait s'initialiser lorsque vous êtes sur le point de déclarer la constante.
Par exemple :
Variable
la source
let
est utilisé pour déclarer une valeur constante - vous ne la modifierez pas après lui avoir donné une valeur initiale.var
est utilisé pour déclarer une valeur variable - vous pouvez changer sa valeur comme vous le souhaitez.la source
let est utilisé pour définir des constantes et var pour définir des variables. Vous définissez la chaîne à l'aide de var, une chaîne particulière peut être modifiée (ou mutée) en l'affectant à une variable (auquel cas elle peut être modifiée), et si vous définissez la chaîne à l'aide de laissez sa constante (auquel cas elle ne peut pas être modifié):
la source
let mot clé définit une constante
donc myNum ne peut pas être modifié par la suite;
Mais var définit une variable ordinaire.
La valeur d'une constante n'a pas besoin d'être connue au moment de la compilation, mais vous devez lui affecter une valeur exactement une fois.
Vous pouvez utiliser presque tous les caractères que vous aimez pour les noms constants et variables, y compris les caractères Unicode;
par exemple
Mais si nous prenons alors laisser ...
la source
Comme Luc-Oliver, NullData et quelques autres l'ont dit ici,
let
définit les données immuables tout envar
définissant les données mutables. Tout cefunc
qui peut être appelé sur la variable qui est marquéemutating
ne peut être appelé que s'il s'agit d'unevar
variable (le compilateur générera une erreur). Cela vaut également pour ceuxfunc
qui prennent uneinout
variable.Cependant,
let
etvar
signifie aussi que la variable ne peut être réaffecté. Il a deux significations, toutes deux à des fins très similairesla source
La valeur var peut être modifiée après l'initialisation. Mais que la valeur ne change pas, lorsqu'elle est intilisée une fois.
En cas de var
En cas de location
la source
Le mot-clé var est utilisé pour définir une variable dont vous pouvez facilement changer la valeur comme ceci:
Cependant, le mot clé let sert uniquement à créer une constante utilisée lorsque vous ne souhaitez pas modifier à nouveau la valeur de la constante. Si vous essayez de changer la valeur de la constante, vous obtiendrez une erreur:
la source
Let est une variable immuable, ce qui signifie qu'elle ne peut pas être modifiée, d'autres langages l'appellent une constante. En C ++, vous pouvez le définir comme const.
Var est une variable mutable, ce qui signifie qu'elle peut être modifiée. En C ++ (mise à jour de la version 2011), c'est la même chose que d'utiliser auto, bien que swift permette plus de flexibilité dans l'utilisation. Il s'agit du type de variable le plus connu des débutants.
la source
let est une valeur constante, elle ne peut donc jamais être modifiée.
Var est une variable et peut changer (mais une fois définie, elle ne doit pas être utilisée avec un type de données différent.)
Si vous essayez de changer la variable en un autre type de données, cela ne fonctionnera pas
la source
La principale différence est que la
var
valeur de la variable peut changer etlet
ne peut pas. Si vous souhaitez avoir des données d'entrée utilisateur, vous devez utiliservar
pour que la valeur puisse être modifiée et utiliser unelet
variable de type de données pour que la valeur ne puisse pas être modifiée.la source
Une valeur peut être réaffectée en cas de var
** la constante newAge ne peut pas être réaffectée à une nouvelle valeur. Essayer de le faire donnera une erreur de temps de compilation **
la source
"Utilisez let pour faire une constante et var pour faire une variable"
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.
https://itun.es/us/jEUH0.lla source
var est variable qui peut être modifiée autant de fois que vous le souhaitez et à chaque fois
par exemple
laisse constant qui ne peut pas être changé
par exemple
la source
Même si vous avez déjà beaucoup de différence entre let et var, mais une différence principale est:
la source
Tout le monde a à peu près répondu à cette question, mais voici un moyen de vous souvenir de ce que
Laissons toujours dire la même chose de "let" car laissez cela fonctionner pour une fois et toujours comme pour les variables "var" qui peuvent toujours changer d'où qu'elles soient appelées variables
la source
var
est le seul moyen de créer une variable en swift.var
ne signifie pas variable dynamique comme dans le cas de langages interprétés comme javascript. Par exemple,Dans ce cas, le type de variable
name
est déduit que le nom est de typeString
, nous pouvons également créer des variables en définissant explicitement le type, par exempleMaintenant, si vous affectez une chaîne à l'âge, le compilateur donne l'erreur.
let
est utilisé pour déclarer des constantes. Par exempleOu nous pouvons aussi faire,
Si vous essayez de changer la valeur de city, cela donne une erreur au moment de la compilation.
la source
let est utilisé pour les constantes qui ne peuvent pas être modifiées alors que var est une variable ordinaire
Exemple:
let name = "Bob" Quelque chose comme name = "Jim" générera une erreur car une constante ne peut pas être modifiée.
la source
DIFFÉRENCE SIMPLE
let = (ne peut pas être modifié)
var = (mise à jour à tout moment)
la source
Source: https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/
Lorsque vous déclarez une variable avec var, cela signifie qu'elle peut être mise à jour, elle est variable, sa valeur peut être modifiée.
Lorsque vous déclarez une variable avec let, cela signifie qu'elle ne peut pas être mise à jour, elle n'est pas variable, sa valeur ne peut pas être modifiée.
Comprenons l'exemple ci-dessus: Nous avons créé une nouvelle variable «a» avec «mot-clé var» et attribué la valeur «1». Lorsque j'imprime «a», j'obtiens la sortie 1. Puis j'affecte 2 à «var a», c'est-à-dire que je modifie la valeur de la variable «a». Je peux le faire sans obtenir d'erreur de compilation car je l'ai déclaré comme var.
Dans le deuxième scénario, j'ai créé une nouvelle variable «b» avec «let mot-clé» et affecté la valeur «4». Lorsque j'imprime «b», j'en ai obtenu 4 en sortie. Ensuite, j'essaie d'attribuer 5 à «let b», c'est-à-dire que j'essaie de modifier la variable «let» et j'obtiens une erreur de temps de compilation «Impossible d'attribuer à la valeur:« b »est une constante« let »».
la source
Bien qu'actuellement je lise toujours le manuel, mais je pense que c'est très proche du
const
pointeur C / C ++ . En d'autres termes, quelque chose comme la différence entrechar const*
etchar*
. Le compilateur refuse également de mettre à jour le contenu, pas seulement la réassignation de référence (pointeur).Par exemple, supposons que vous ayez cette structure. Veillez à ce que ce soit une structure, pas une classe. AFAIK, les classes n'ont pas de concept d'état immuable.
Comme les structures sont immuables par défaut, vous devez marquer une méthode de mutation avec
mutating
. Et parce que le nomaaa1
est constant, vous ne pouvez pas appeler de méthode de mutation dessus. C'est exactement ce que nous attendions sur les pointeurs C / C ++.Je crois que c'est un mécanisme pour supporter une sorte de substance de const-correct .
la source
Déclarez les constantes avec le mot clé let et les variables avec le mot clé var.
Déclarez plusieurs constantes ou plusieurs variables sur une seule ligne, séparées par des virgules:
Impression des constantes et des variables
Vous pouvez imprimer la valeur actuelle d'une constante ou d'une variable avec la fonction println:
Swift utilise l'interpolation de chaîne pour inclure le nom d'une constante ou d'une variable comme espace réservé dans une chaîne plus longue
Mettez le nom entre parenthèses et échappez-le avec une barre oblique inverse avant la parenthèse d'ouverture:
Référence: http://iosswift.com.au/?p=17
la source
J'ai trouvé une bonne réponse, j'espère que cela peut aider :)
la source
let
ne signifie pas que l' objet est immuable, cela signifie que le pointeur est immuable. Pour obtenir la fonctionnalité équivalente dans Obj-C, vous devez utiliserNSObject *const myObject = someobject;
- Les propriétés de cet objet peuvent être modifiées, mais le pointeurmyObject
ne peut pas être modifié pour pointer vers un autre objet.const pointer
qui ne peuvent pas être modifiées à l'avenir, mais sa valeur peut l'être. Vous ne pouvez pas le réinitialiser mais vous pouvez l'utiliser comme vous le souhaitez.