¿Cuál es la diferencia entre lety varen 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
letpalabra clave define una constante:No
theAnswerse puede cambiar después. Es por esoweakque no se puede escribir nada usandolet. Deben cambiar durante el tiempo de ejecución y debes usarlo en suvarlugar.El
vardefine 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
varyletson referencias , porletlo tanto, es una referencia constante . El uso de tipos fundamentales no muestra realmente qué tanletdiferente esconst. La diferencia viene cuando se usa con instancias de clase (tipos de referencia):fuente
varyletno tiene nada que ver con si el identificador que está vinculado es una referencia o no. Si el tipo es unstructtipo, conceptualmente es un valor. Si el tipo es aclasses conceptualmente una referencia y la referencia es una constante siletse usa. SiCTestfuera una estructura, ninguna de susletTesttareas funcionaría.structtipo 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 dellettipo de valor enlazado.letse usa para definir constantes yvarpara 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
aPersontiene setters podría modificar sus propiedades ¿verdad? entonces elletno hace loPersoninmutable.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:
letes constantevarEs dinámico.Poco de descripción:
letcrea 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.varcrea una variable (algo así comoNSMutableString) para que pueda cambiar el valor de la misma. Pero esto ha sido respondido varias veces.fuente
letdefine una "constante". Su valor se establece una vez y solo una vez, aunque no necesariamente cuando lo declara. Por ejemplo, usted usaletpara definir una propiedad en una clase que debe establecerse durante la inicialización:Con esta configuración, no es válido asignar
firstNameolastNamedespués de llamar (por ejemplo)Person(first:"Malcolm", last:"Reynolds")para crear unPersoninstancia.Usted debe definir un tipo para todas las variables (
letovar) 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-constantvar-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
structpuede cambiar su estado de mutabilidad:let+struct=immutable= Constante de valorPuede no ser reasignado o cambió
var+struct=mutableSe puede reasignar o cambiar
Tipo de referencia (clase)
Los veloces
classessonmutableun prioratolet+class= Constante de direcciónPuede no ser reasignado y puede ser cambiado
var+classSe puede reasignar o cambiar
mutating- Funciones de estructura mutantePuede marcar el método de una estructura como
mutatingvar+structinoutModificar estructura dentro de una funciónPuede marcar el parámetro de una función (que es struct) como
inoutDado que es
structun tipo de valor, se pasa por valor como resultado, la función recuperará una copia. Si marca un parámetrostructcomoinout, significa que este parámetro se conviertevary puede cambiar un estado destructy 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
letse usa para declarar un valor constante; no lo cambiará después de darle un valor inicial.varse 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í,
letdefine datos inmutables mientrasvardefine datos mutables. Cualquierafuncque se pueda invocar en la variable que está marcadamutatingsolo se puede invocar si es unavarvariable (el compilador arrojará un error). Esto también se aplica afunclos que toman unainoutvariable.Sin embargo,
letyvartambié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
varvalor variable puede cambiar yletno puede. Si desea tener datos de entrada del usuario, lo usaríavarpara que el valor se pueda cambiar y use laletvariable 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
varEs la única forma de crear variables en Swift.varno significa variable dinámica como en el caso de lenguajes interpretados como javascript. Por ejemplo,En este caso, el tipo de variable
namese 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.
letse 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
constpuntero 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 nombreaaa1es 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
letno 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 punteromyObjectno se puede modificar para que apunte a otro objeto.const pointerque no se puede cambiar en el futuro pero su valor sí se puede cambiar. No puede reiniciarlo, pero puede usarlo como desee.