¿Cuál es la diferencia entre let
y var
en el lenguaje Swift de Apple?
Según tengo entendido, es un lenguaje compilado pero no verifica el tipo en tiempo de compilación. Me confunde ¿Cómo sabe el compilador sobre el error de tipo? Si el compilador no verifica el tipo, ¿no es un problema con el entorno de producción?
Respuestas:
La
let
palabra clave define una constante:No
theAnswer
se puede cambiar después. Es por esoweak
que no se puede escribir nada usandolet
. Deben cambiar durante el tiempo de ejecución y debes usarlo en suvar
lugar.El
var
define una variable ordinaria.Qué es interesante:
Otra característica extraña:
Extractos de: Apple Inc. "El lenguaje de programación Swift". iBooks https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
EDITAR
Debido a que los comentarios piden agregar otros hechos a la respuesta, convertir esto a la respuesta wiki de la comunidad . Siéntase libre de editar la respuesta para mejorarla.
fuente
auto 🐶🐮 = "dogcow";
funciona en C ++ para clang.if 😍 === 💝 { 💔 = ♠︎ }
:);)De acuerdo con el libro del lenguaje de programación Swift
Ambos
var
ylet
son referencias , porlet
lo tanto, es una referencia constante . El uso de tipos fundamentales no muestra realmente qué tanlet
diferente esconst
. La diferencia viene cuando se usa con instancias de clase (tipos de referencia):fuente
var
ylet
no tiene nada que ver con si el identificador que está vinculado es una referencia o no. Si el tipo es unstruct
tipo, conceptualmente es un valor. Si el tipo es aclass
es conceptualmente una referencia y la referencia es una constante silet
se usa. SiCTest
fuera una estructura, ninguna de susletTest
tareas funcionaría.struct
tipo de valor, no tiene nada de conceptual. Lo mismo conclass
- tipo de referencia. Al modificar un tipo de valor, crea una nueva instancia de este tipo. developer.apple.com/swift/blog/?id=10 Entonces, obviamente, no puede modificar los campos / propiedades dellet
tipo de valor enlazado.let
se usa para definir constantes yvar
para definir variables.fuente
Tal vez sea mejor establecer esta diferencia mediante la noción de Mutabilidad / Inmutabilidad que es el paradigma correcto de valores y la capacidad de cambio de instancias en el espacio Objetos que es más grande que las únicas nociones habituales "constantes / variables". Y además, esto está más cerca del enfoque del Objetivo C.
2 tipos de datos: tipo de valor y tipo de referencia.
En el contexto de los Tipos de valor:
'let' define un valor constante (indomable). 'var' define un valor modificable (mutable).
En el contexto de los Tipos de referencia:
La etiqueta de un dato no es el valor sino la referencia a un valor.
if aPerson = Person (nombre: Foo, primero: Bar)
aPerson no contiene los datos de esta persona, sino la referencia a los datos de esta persona.
fuente
aPerson
tiene setters podría modificar sus propiedades ¿verdad? entonces ellet
no hace loPerson
inmutable.los
La sección Declaración de constantes y variables de la documentación del lenguaje de programación Swift especifica lo siguiente:
Asegúrese de comprender cómo funciona esto para los tipos de referencia. A diferencia de los tipos de valor, las propiedades subyacentes del objeto pueden cambiar a pesar de que una instancia de un tipo de referencia se declare como una constante. Consulte la sección Las clases son tipos de referencia de la documentación y observe el ejemplo en el que cambian la propiedad frameRate.
fuente
Muy simple:
let
es constantevar
Es dinámico.Poco de descripción:
let
crea una constante (algo así como unNSString
). No puede cambiar su valor una vez que lo haya configurado. Sin embargo, aún puede agregarlo a otras cosas y crear nuevas variables.var
crea una variable (algo así comoNSMutableString
) para que pueda cambiar el valor de la misma. Pero esto ha sido respondido varias veces.fuente
let
define una "constante". Su valor se establece una vez y solo una vez, aunque no necesariamente cuando lo declara. Por ejemplo, usted usalet
para definir una propiedad en una clase que debe establecerse durante la inicialización:Con esta configuración, no es válido asignar
firstName
olastName
después de llamar (por ejemplo)Person(first:"Malcolm", last:"Reynolds")
para crear unPerson
instancia.Usted debe definir un tipo para todas las variables (
let
ovar
) en tiempo de compilación, y cualquier código que intenta establecer una variable sólo podrán utilizar ese tipo (o un subtipo). Puede asignar un valor en tiempo de ejecución, pero su tipo debe ser conocido en tiempo de compilación.fuente
let
-constant
var
-variable
[Constante vs variable]
[Estructura vs clase]
El documento oficial docs.swift.org dice
Esta terminología en realidad describe un mecanismo de reasignación
Mutabilidad - modificable - el estado del objeto se puede cambiar después de la creación
Valor y tipo de referencia [Acerca de]
Valor (estructura, enumeración)
Swift
struct
puede cambiar su estado de mutabilidad:let
+struct
=immutable
= Constante de valorPuede no ser reasignado o cambió
var
+struct
=mutable
Se puede reasignar o cambiar
Tipo de referencia (clase)
Los veloces
classes
sonmutable
un prioratolet
+class
= Constante de direcciónPuede no ser reasignado y puede ser cambiado
var
+class
Se puede reasignar o cambiar
mutating
- Funciones de estructura mutantePuede marcar el método de una estructura como
mutating
var
+struct
inout
Modificar estructura dentro de una funciónPuede marcar el parámetro de una función (que es struct) como
inout
Dado que es
struct
un tipo de valor, se pasa por valor como resultado, la función recuperará una copia. Si marca un parámetrostruct
comoinout
, significa que este parámetro se conviertevar
y puede cambiar un estado destruct
y estos cambios serán visibles fuera del alcance de la funciónfuente
Una diferencia más, que he encontrado en otros idiomas para las constantes es: no se puede inicializar la constante (let) para más adelante , se debe inicializar cuando esté a punto de declarar la constante.
Por ejemplo :
Variable
fuente
let
se usa para declarar un valor constante; no lo cambiará después de darle un valor inicial.var
se utiliza para declarar un valor variable; puede cambiar su valor como lo desee.fuente
let se usa para definir constantes y var para definir variables. Usted define la cadena usando var, entonces una cadena particular puede modificarse (o mutarse) asignándola a una variable (en cuyo caso puede modificarse), y si define la cadena usando deje que sea una constante (en cuyo caso no puede ser modificado):
fuente
dejar palabra clave define una constante
entonces myNum no se puede cambiar después;
Pero var define una variable ordinaria.
No es necesario conocer el valor de una constante en tiempo de compilación, pero debe asignarle un valor exactamente una vez.
Puede usar casi cualquier carácter que desee para nombres constantes y variables, incluidos los caracteres Unicode;
p.ej
Pero si tomamos let entonces ...
fuente
Como Luc-Oliver, NullData y algunos otros han dicho aquí,
let
define datos inmutables mientrasvar
define datos mutables. Cualquierafunc
que se pueda invocar en la variable que está marcadamutating
solo se puede invocar si es unavar
variable (el compilador arrojará un error). Esto también se aplica afunc
los que toman unainout
variable.Sin embargo,
let
yvar
también significa que la variable no se puede reasignar. Tiene dos significados, ambos con propósitos muy similares.fuente
El valor var se puede cambiar, después de inicializar. Pero dejar que el valor no se cambie cuando se intiliza una vez.
En caso de var
En caso de dejar
fuente
La palabra clave var se usa para definir una variable cuyo valor puede cambiar fácilmente de esta manera:
Sin embargo, la palabra clave let es solo para crear una constante utilizada cuando no desea cambiar el valor de la constante nuevamente. Si intentara cambiar el valor de la constante, obtendrá un error:
fuente
Let es una variable inmutable, lo que significa que no se puede cambiar, otros idiomas llaman a esto una constante. En C ++ puede definirlo como constante.
Var es una variable mutable, lo que significa que se puede cambiar. En C ++ (actualización de la versión 2011), es lo mismo que usar auto, aunque swift permite una mayor flexibilidad en el uso. Este es el tipo de variable más conocido para principiantes.
fuente
let es un valor constante, por lo que nunca se puede cambiar.
Var es una variable y puede cambiar (pero después de que se define no a un tipo de datos diferente).
Si intenta cambiar la variable a un tipo de datos diferente, no funcionará
fuente
La principal diferencia es que el
var
valor variable puede cambiar ylet
no puede. Si desea tener datos de entrada del usuario, lo usaríavar
para que el valor se pueda cambiar y use lalet
variable de tipo de datos para que el valor no se pueda cambiar.fuente
Se puede reasignar un valor en caso de var
** la constante newAge no se puede reasignar a un nuevo valor. Intentar hacerlo generará un error de tiempo de compilación **
fuente
"Utilice let para hacer una constante y var para hacer una variable"
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.
https://itun.es/us/jEUH0.lfuente
var es variable y puede cambiarse tantas veces como desee y siempre
por ejemplo
let es constante y no se puede cambiar
por ejemplo
fuente
Aunque ya tiene muchas diferencias entre let y var, pero una diferencia principal es:
fuente
Todo el mundo ha respondido esto, pero aquí hay una manera de recordar qué es qué
Digamos siempre lo mismo piensa en "let" como dejar que esto funcione por una vez y siempre como para "var" las variables siempre pueden cambiar, por lo tanto, se llaman variables
fuente
var
Es la única forma de crear variables en Swift.var
no significa variable dinámica como en el caso de lenguajes interpretados como javascript. Por ejemplo,En este caso, el tipo de variable
name
se infiere que el nombre es de tipoString
, también podemos crear variables definiendo explícitamente el tipo, por ejemploAhora, si asigna una cadena a la edad, el compilador da el error.
let
se usa para declarar constantes. Por ejemploO también podemos hacer,
Si intenta cambiar el valor de city, da error en tiempo de compilación.
fuente
let se usa para constantes que no se pueden modificar mientras var es una variable ordinaria
Ejemplo:
let name = "Bob" Algo como name = "Jim" arrojará un error ya que no se puede modificar una constante.
fuente
DIFERENCIA SIMPLE
let = (no se puede cambiar)
var = (actualización en cualquier momento)
fuente
Fuente: https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/
Cuando declaras una variable con var, significa que se puede actualizar, es variable, su valor se puede modificar.
Cuando declaras una variable con let, significa que no se puede actualizar, no es variable, su valor no se puede modificar.
Comprendamos el ejemplo anterior: hemos creado una nueva variable "a" con "palabra clave var" y hemos asignado el valor "1". Cuando imprimo "a" obtengo la salida como 1. Luego asigno 2 a "var a", es decir, estoy modificando el valor de la variable "a". Puedo hacerlo sin obtener el error del compilador porque lo declaró como var.
En el segundo escenario, creé una nueva variable "b" con "let keyword" y asigné el valor "4". Cuando imprimo "b" obtuve 4 como salida. Luego trato de asignar 5 a "let b", es decir, estoy tratando de modificar la variable "let" y aparece el error de tiempo de compilación "No se puede asignar al valor: 'b' es una constante 'let'".
fuente
Aunque actualmente todavía estoy leyendo el manual, pero creo que esto está muy cerca del
const
puntero C / C ++ . En otras palabras, algo así como la diferencia entrechar const*
ychar*
. El compilador también se niega a actualizar el contenido, no solo la reasignación de referencia (puntero).Por ejemplo, supongamos que tiene esta estructura. Tenga cuidado de que esto sea una estructura, no una clase. AFAIK, las clases no tienen un concepto de estado inmutable.
Debido a que las estructuras son inmutables por defecto, debe marcar un método mutador con
mutating
. Y debido a que el nombreaaa1
es constante, no se puede llamar a ningún método mutador. Esto es exactamente lo que esperábamos en los punteros C / C ++.Creo que este es un mecanismo para admitir una especie de corrección constante .
fuente
Declare constantes con la palabra clave let y variables con la palabra clave var.
Declare constantes múltiples o variables múltiples en una sola línea, separadas por comas:
Impresión de constantes y variables
Puede imprimir el valor actual de una constante o variable con la función println:
Swift utiliza la interpolación de cadenas para incluir el nombre de una constante o variable como marcador de posición en una cadena más larga
Envuelva el nombre entre paréntesis y escape con una barra diagonal inversa antes del paréntesis de apertura:
Referencia: http://iosswift.com.au/?p=17
fuente
Encontré una buena respuesta, espero que pueda ayudar :)
fuente
let
no significa que el objeto sea inmutable, significa que el puntero es inmutable. Para obtener la funcionalidad equivalente en Obj-C, debe usarNSObject *const myObject = someobject;
: las propiedades de dicho objeto se pueden modificar, pero el punteromyObject
no se puede modificar para que apunte a otro objeto.const pointer
que no se puede cambiar en el futuro pero su valor sí se puede cambiar. No puede reiniciarlo, pero puede usarlo como desee.