Qual é a diferença entre let
e var
no idioma Swift da Apple?
No meu entendimento, é uma linguagem compilada, mas não verifica o tipo no momento da compilação. Isso me deixa confuso. Como o compilador sabe sobre o erro de tipo? Se o compilador não verificar o tipo, não há um problema no ambiente de produção?
Respostas:
A
let
palavra-chave define uma constante:O
theAnswer
não pode ser alterado depois. É por isso que qualquer coisaweak
não pode ser escrita usandolet
. Eles precisam mudar durante o tempo de execução e você deve estar usandovar
.O
var
define uma variável comum.O que é interessante:
Outra característica estranha:
Trechos de: Apple Inc. “A linguagem de programação Swift”. iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
EDITAR
Como comentários pedindo a adição de outros fatos à resposta, convertendo-os em respostas da wiki da comunidade . Sinta-se livre para editar a resposta para torná-la melhor.
fonte
auto 🐶🐮 = "dogcow";
funciona em C ++ para clang.if 😍 === 💝 { 💔 = ♠︎ }
:);)De acordo com o Swift Programming Language Book
Ambas
var
elet
são referências , portantolet
é uma referência const . O uso de tipos fundamentais não mostra realmente comolet
é diferenteconst
. A diferença ocorre ao usá-lo com instâncias de classe (tipos de referência):fonte
var
elet
não tem nada a ver com o fato de o identificador vinculado ser ou não uma referência. Se o tipo é umstruct
tipo, é conceitualmente um valor. Se o tipo é umclass
, conceitualmente é uma referência e a referência é uma constante selet
for usada. SeCTest
fosse uma estrutura, nenhuma de suasletTest
tarefas funcionaria.struct
tipo de valor, não há nada conceitual sobre ele. O mesmo comclass
- tipo de referência. Ao modificar um tipo de valor, você cria uma nova instância desse tipo. developer.apple.com/swift/blog/?id=10 Portanto, obviamente, você não pode modificar campos / propriedades dolet
tipo vinculado ao valor.let
é usado para definir constantes evar
para definir variáveis.fonte
Talvez seja melhor declarar essa diferença pela noção de Mutabilidade / Imutabilidade, que é o paradigma correto de mutabilidade de valores e instâncias no espaço Objetos, que é maior que as únicas noções "constantes / variáveis" habituais. Além disso, isso está mais próximo da abordagem do Objetivo C.
2 tipos de dados: tipo de valor e tipo de referência.
No contexto de tipos de valor:
'let' define um valor constante (indomável). 'var' define um valor mutável (mutável).
No contexto de tipos de referência:
O rótulo de um dado não é o valor, mas a referência a um valor.
if aPerson = Person (nome: Foo, primeiro: Bar)
aPerson não contém os dados desta pessoa, mas a referência aos dados desta pessoa.
fonte
aPerson
tiver setters você pode modificar suas propriedades certo? então olet
não torna oPerson
imutável.o
A seção Declarantes de constantes e variáveis da documentação da linguagem de programação Swift especifica o seguinte:
Certifique-se de entender como isso funciona para os tipos de referência. Diferentemente dos Tipos de Valor, as propriedades subjacentes do objeto podem mudar, apesar de uma instância de um tipo de referência ser declarada como constante. Consulte a seção Classes são tipos de referência da documentação e veja o exemplo em que eles alteram a propriedade frameRate.
fonte
Muito simples:
let
é constante.var
é dinâmico.Bocado da descrição:
let
cria uma constante. (mais ou menos como umNSString
). Você não pode alterar seu valor depois de defini-lo. Você ainda pode adicioná-lo a outras coisas e criar novas variáveis.var
cria uma variável (mais ou menos comoNSMutableString
) para que você possa alterar o valor. Mas isso foi respondido várias vezes.fonte
let
define uma "constante". Seu valor é definido uma vez e apenas uma vez, embora não necessariamente quando você o declara. Por exemplo, vocêlet
pode definir uma propriedade em uma classe que deve ser definida durante a inicialização:Com esta configuração, é inválido atribuir a
firstName
oulastName
após chamar (por exemplo)Person(first:"Malcolm", last:"Reynolds")
para criar umaPerson
instância.Você deve definir um tipo para todas as variáveis (
let
ouvar
) em tempo de compilação, e qualquer código que tente definir uma variável pode usar apenas esse tipo (ou um subtipo). Você pode atribuir um valor no tempo de execução, mas seu tipo deve ser conhecido no tempo de compilação.fonte
let
-constant
var
-variable
[Constante vs variável]
[Estrutural vs Classe]
O documento oficial docs.swift.org diz
Essa terminologia realmente descreve um mecanismo de reatribuição
Mutabilidade - mutável - o estado do objeto pode ser alterado após a criação
Valor e tipo de referência [Sobre]
Valor (Struct, Enum)
Os Swift
struct
podem alterar seu status de mutabilidade:let
+struct
=immutable
= Constante de valorPode não ser reatribuído ou alterado
var
+struct
=mutable
Pode ser reatribuído ou alterado
Tipo de referência (classe)
Swift's
classes
sãomutable
um prioradolet
+class
= Constante de endereçoEle pode não ser transferido e pode ser alterado
var
+class
Pode ser reatribuído ou alterado
mutating
- Funções de mutação do StructVocê pode marcar o método de uma estrutura como
mutating
var
+struct
inout
Modificando struct dentro de uma funçãoVocê pode marcar o parâmetro de uma função (que é struct) como
inout
Como
struct
um tipo de valor, ele é passado por valor, pois a função de resultado recuperará uma cópia. Se você marcar um parâmetrostruct
comoinout
, significa que esse parâmetro se tornarávar
e você poderá alterar um estadostruct
e essas alterações serão visíveis fora do escopo da funçãofonte
Mais uma diferença, que encontrei em outros idiomas para Constantes, é: não é possível inicializar a constante (let) para mais tarde , deve inicializar quando você estiver prestes a declarar a constante.
Por exemplo :
Variável
fonte
let
é usado para declarar um valor constante - você não o alterará depois de atribuir um valor inicial.var
é usado para declarar um valor variável - você pode alterá-lo conforme desejar.fonte
let é usado para definir constantes e var para definir variáveis. Você define a string usando var, então String específica pode ser modificada (ou mutada) atribuindo-a a uma variável (nesse caso, pode ser modificada) e, se você definir a string usando deixe que seja uma constante (nesse caso, não poderá ser modificado):
fonte
deixe a palavra-chave define uma constante
então myNum não pode ser alterado depois;
Mas var define uma variável comum.
O valor de uma constante não precisa ser conhecido em tempo de compilação, mas você deve atribuir um valor exatamente uma vez.
Você pode usar quase qualquer caractere que desejar para nomes constantes e variáveis, incluindo caracteres Unicode;
por exemplo
Mas se tomarmos deixe então ...
fonte
Como Luc-Oliver, NullData e alguns outros já disseram aqui,
let
define dados imutáveis enquantovar
define dados mutáveis. Qualquer umfunc
que possa ser chamado na variável marcadamutating
só poderá ser chamado se for umavar
variável (o compilador lançará um erro). Isso também se aplica aosfunc
que recebem umainout
variável.No entanto,
let
evar
também significa que a variável não pode ser reatribuída. Tem dois significados, ambos com finalidades muito semelhantesfonte
O valor var pode ser alterado após a inicialização. Mas deixe o valor não ser alterado, quando for fertilizar uma vez.
Em caso de var
Em caso de deixar
fonte
A palavra-chave var é usada para definir uma variável cujo valor você pode alterar facilmente assim:
No entanto, a palavra-chave let é apenas para criar uma constante usada quando você não deseja alterar o valor da constante novamente. Se você tentar alterar o valor da constante, receberá um erro:
fonte
Let é uma variável imutável, o que significa que não pode ser alterado; outros idiomas chamam isso de constante. Em C ++, você pode defini-lo como const.
Var é uma variável mutável, o que significa que pode ser alterada. No C ++ (atualização de versão de 2011), é o mesmo que usar auto, embora o swift permita mais flexibilidade no uso. Este é o tipo de variável mais conhecido para iniciantes.
fonte
let é um valor constante, portanto nunca pode ser alterado.
Var é uma variável e pode ser alterada (mas depois de definida não para um tipo de dados diferente).
Se você tentar alterar a variável para um dataType diferente, ela não funcionará
fonte
A principal diferença é que o
var
valor da variável pode mudar elet
não pode. Se você deseja ter dados de entrada do usuário, usevar
para que o valor possa ser alterado e use alet
variável de tipo de dados para que o valor não possa ser alterado.fonte
Um valor pode ser reatribuído no caso de var
** a constante newAge não pode ser reatribuída para um novo valor. Tentar fazer isso resultará em um erro de tempo de compilação **
fonte
"Use let para fazer uma constante e var para fazer uma variável"
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.
https://itun.es/us/jEUH0.lfonte
var é variável que pode ser alterada quantas vezes você quiser e sempre
por exemplo
let é constante que não pode ser alterado
por exemplo
fonte
Mesmo que você já tenha muitas diferenças entre let e var, uma diferença principal é:
fonte
Todo mundo já respondeu isso, mas aqui está uma maneira de você lembrar o que é o que
Let sempre diz o mesmo pensamento de "let", pois deixe isso funcionar pela primeira vez e sempre como para "var" as variáveis sempre podem mudar, portanto, sendo chamadas de variáveis
fonte
var
é a única maneira de criar uma variável rapidamente.var
não significa variável dinâmica como no caso de linguagens interpretadas como javascript. Por exemplo,Nesse caso, o tipo de variável
name
é inferido de que nome é do tipoString
, também podemos criar variáveis definindo explicitamente o tipo, por exemploAgora, se você atribuir uma string a idade, o compilador fornecerá o erro.
let
é usado para declarar constantes. Por exemploOu também podemos fazer,
Se você tentar alterar o valor da cidade, ocorrerá um erro no momento da compilação.
fonte
let é usado para constantes que não podem ser modificadas enquanto var é uma variável comum
Exemplo:
let name = "Bob" Algo como name = "Jim" gera um erro, pois uma constante não pode ser modificada.
fonte
DIFERENÇA SIMPLES
let = (não pode ser alterado)
var = (qualquer atualização a qualquer momento)
fonte
Fonte: https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/
Quando você declara uma variável com var, significa que ela pode ser atualizada, é variável, seu valor pode ser modificado.
Quando você declara uma variável com let, significa que não pode ser atualizada, não é variável, seu valor não pode ser modificado.
Vamos entender o exemplo acima: Criamos uma nova variável "a" com "var keyword" e atribuímos o valor "1". Quando imprimo "a", obtive a saída como 1. Então atribuo 2 a "var a", ou seja, estou modificando o valor da variável "a". Eu posso fazer isso sem obter erro do compilador porque o declarei como var.
No segundo cenário, criei uma nova variável "b" com "let keyword" e atribui o valor "4". Quando imprimo "b", obtive 4 como saída. Então, tento atribuir 5 a “let b”, ou seja, estou tentando modificar a variável “let” e recebo o erro de tempo de compilação “Não é possível atribuir ao valor: 'b' é uma constante 'let'”.
fonte
Embora atualmente ainda esteja lendo o manual, acho que isso está muito próximo do
const
ponteiro C / C ++ . Em outras palavras, algo como a diferença entrechar const*
echar*
. O compilador também se recusa a atualizar o conteúdo, não apenas a reatribuição de referência (ponteiro).Por exemplo, digamos que você tenha essa estrutura. Tome cuidado para que isso seja uma estrutura, não uma classe. AFAIK, as classes não têm um conceito de estado imutável.
Como as estruturas são imutáveis por padrão, você precisa marcar um método mutador
mutating
. E como o nomeaaa1
é constante, você não pode chamar nenhum método mutador. Isso é exatamente o que esperávamos em ponteiros C / C ++.Eu acredito que este é um mecanismo para suportar um tipo de material de correção constante .
fonte
Declare constantes com a palavra-chave let e variáveis com a palavra-chave var.
Declare várias constantes ou várias variáveis em uma única linha, separadas por vírgulas:
Constantes e variáveis de impressão
Você pode imprimir o valor atual de uma constante ou variável com a função println:
Swift usa interpolação de string para incluir o nome de uma constante ou variável como espaço reservado em uma string maior
Coloque o nome entre parênteses e escape com uma barra invertida antes do parêntese de abertura:
Referência: http://iosswift.com.au/?p=17
fonte
Encontrou uma boa resposta espero que possa ajudar :)
fonte
let
não significa que o objeto é imutável, significa que o ponteiro é imutável. Para obter a funcionalidade equivalente no Obj-C, você precisa usarNSObject *const myObject = someobject;
- As propriedades desse objeto podem ser modificadas, mas o ponteiromyObject
não pode ser modificado para apontar para outro objeto.const pointer
que não podem ser mudadas no futuro, mas seu valor pode ser. Você não pode reinicializar, mas pode usá-lo como quiser.