В чем разница между let
и var
в Swift языке Apple?
В моем понимании это компилируемый язык, но он не проверяет тип во время компиляции. Это меня смущает. Как компилятор узнает об ошибке типа? Если компилятор не проверяет тип, это не проблема с производственной средой?
Ответы:
let
Ключевое слово определяет константу:Не
theAnswer
может быть изменено впоследствии. Вот почему ничегоweak
нельзя написать с помощьюlet
. Они должны измениться во время выполнения, и вы должны использоватьvar
вместо этого.var
Определяет обычную переменную.Что интересно:
Еще одна странная особенность:
Выдержки из: Apple Inc. «Язык программирования Swift». интерактивные книги. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
РЕДАКТИРОВАТЬ
Потому что комментарии просят добавить другие факты к ответу, преобразовывая это в ответ сообщества вики . Не стесняйтесь редактировать ответ, чтобы сделать его лучше.
источник
auto 🐶🐮 = "dogcow";
работает в C ++ для Clang.if 😍 === 💝 { 💔 = ♠︎ }
:);)Согласно Книге языков программирования Swift
Оба
var
иlet
являются ссылками , поэтомуlet
является константной ссылкой . Использование фундаментальных типов на самом деле не показывает,let
чем отличаетсяconst
. Разница возникает при использовании его с экземплярами классов (ссылочными типами):источник
var
и неlet
имеют никакого отношения к тому, является ли привязываемый идентификатор ссылкой или нет. Если тип являетсяstruct
типом, это концептуально значение. Если тип -class
это концептуально ссылка, а ссылка является константой, еслиlet
используется. Если быCTest
была структура, ни одно из вашихletTest
заданий не сработало бы.struct
значения, в этом нет ничего концептуального. То же самое сclass
- ссылочный тип. При изменении типа значения вы создаете новый экземпляр этого типа. developer.apple.com/swift/blog/?id=10 Очевидно, что вы не можете изменять поля / свойства,let
связанные с типом значения.let
используется для определения констант иvar
определения переменных.источник
Возможно, лучше констатировать это различие понятием изменчивости / неизменности, которое является правильной парадигмой изменчивости значений и экземпляров в пространстве объектов, которая больше, чем единственные обычные понятия «постоянная / переменная». И, кроме того, это ближе к подходу Objective C.
2 типа данных: тип значения и тип ссылки.
В контексте типов значений:
«let» определяет постоянное значение (не изменяемое). 'var' определяет изменяемое значение (изменяемое).
В контексте типов ссылок:
Метка данных - это не значение, а ссылка на значение.
if aPerson = Person (имя: Foo, сначала: Bar)
aPerson не содержит Данные этого лица, но содержит ссылку на данные этого Лица.
источник
aPerson
есть сеттеры, вы могли бы изменить его свойства, верно? так чтоlet
не делаетPerson
неизменным.The
Объявление раздела « Константы и переменные » в документации по языку программирования Swift указывает следующее:
Убедитесь, что вы понимаете, как это работает для справочных типов. В отличие от типов значений, базовые свойства объекта могут изменяться, несмотря на то, что экземпляр ссылочного типа объявлен как константа. См. Раздел « Классы - ссылочные типы » документации и посмотрите на пример, где они изменяют свойство frameRate.
источник
Очень просто:
let
постоянно.var
динамичноБит описания:
let
создает постоянную. (вроде какNSString
). Вы не можете изменить его значение, как только вы его установили. Вы все еще можете добавить его к другим вещам и создать новые переменные.var
создает переменную. (вроде какNSMutableString
), чтобы вы могли изменить его значение. Но на это ответили несколько раз.источник
let
определяет «константу». Его значение устанавливается один раз и только один раз, хотя не обязательно, когда вы его объявляете. Например, вы используетеlet
для определения свойства в классе, которое должно быть установлено во время инициализации:При такой настройке недопустимо назначать
firstName
илиlastName
после вызова (например)Person(first:"Malcolm", last:"Reynolds")
создатьPerson
экземпляр.Вы должны определить тип для всех переменных (
let
илиvar
) во время компиляции, и любой код, который пытается установить переменную, может использовать только этот тип (или подтип). Вы можете присвоить значение во время выполнения, но его тип должен быть известен во время компиляции.источник
let
-constant
var
-variable
[Константа против переменной]
[Структура против класса]
Официальный документ docs.swift.org говорит
Эта терминология фактически описывает механизм переназначения
Изменчивость - изменяемая - состояние объекта может быть изменено после создания
Значение и тип ссылки [О программе]
Значение (структура, перечисление)
Swift
struct
могут изменить свой статус изменчивости:let
+struct
=immutable
= Константа значениеможет не быть переназначены или изменены
var
+struct
=mutable
Может быть переназначен или изменен
Тип ссылки (класс)
Свифт
classes
являютсяmutable
а-априорнымlet
+class
= Константа адресаможет не быть переназначен и могут быть изменены
var
+class
Может быть переназначен или изменен
mutating
- Функции Мутирующей СтруктурыВы можете пометить метод структуры как
mutating
var
+struct
inout
Модификация структуры внутри функцииВы можете пометить параметр функции (который является структурой) как
inout
Поскольку
struct
тип значения, он передается по значению, так как в результате функция будет получать копию. Если вы пометите параметрstruct
какinout
параметр, это означает, что этот параметр становитсяvar
и вы можете изменить состояние,struct
и эти изменения будут видны за пределами области действия функции.источник
Еще одно отличие, с которым я столкнулся в других языках для констант, заключается в следующем: не могу инициализировать константу (пусть) на потом , следует инициализировать, когда вы собираетесь объявить константу.
Например :
переменная
источник
let
используется для объявления постоянного значения - вы не измените его после задания начального значения.var
используется для объявления значения переменной - вы можете изменить ее значение по своему желанию.источник
let используется для определения констант, а var для определения переменных. Вы определяете строкуиспользуя вар то конкретная строка может быть изменена (или мутантным), назначив его переменный (в этом случае оно может быть изменено), и если вы определили строкуиспользуя пусть свою константу (в этом случае она не может быть изменен):
источник
ключевое слово let определяет константу
поэтому myNum не может быть изменен впоследствии;
Но var определяет обычную переменную.
Значение константы не нужно знать во время компиляции, но вы должны присвоить ей значение ровно один раз.
Вы можете использовать практически любой символ, который вам нравится, для имен констант и переменных, включая символы Юникода;
например
Но если мы возьмем пусть тогда ...
источник
Как и Luc-Oliver, NullData и некоторые другие уже сказали здесь,
let
определяют неизменяемые данные, аvar
определяют изменяемые данные. Все,func
что может быть вызвано для помеченной переменной,mutating
может быть вызвано, только если она являетсяvar
переменной (компилятор выдаст ошибку). Это также относится к темfunc
, которые принимаютinout
переменную.Тем не менее,
let
иvar
также означает , что переменная не может быть переназначен. Это имеет два значения, оба с очень похожими целямиисточник
Значение var можно изменить после инициализации. Но пусть значение не изменится, когда его задействуют один раз.
В случае вар
В случае аренды
источник
Ключевое слово var используется для определения переменной, значение которой вы можете легко изменить следующим образом:
Однако ключевое слово let используется только для создания константы, используемой, когда вы не хотите снова изменять значение константы. Если вы попытаетесь изменить значение константы, вы получите ошибку:
источник
Пусть является неизменной переменной, то есть ее нельзя изменить, другие языки называют ее константой. В C ++ это вы можете определить как const.
Var является изменяемой переменной, это означает, что она может быть изменена. В C ++ (обновление версии 2011) это то же самое, что и использование auto, хотя swift обеспечивает большую гибкость в использовании. Это более известный тип переменной для начинающих.
источник
let является постоянным значением, поэтому его нельзя изменить.
Var является переменной и может изменяться (но после того, как она определена не для другого типа данных.)
Если вы попытаетесь изменить переменную на другой тип данных, он не будет работать
источник
Основное отличие состоит в том, что
var
значение переменной может меняться, аlet
не может. Если вы хотите, чтобы пользователь вводил данные, вы должны использовать его,var
чтобы изменить значение, и использоватьlet
переменную типа данных, чтобы это значение нельзя было изменить.источник
Значение может быть переназначено в случае var
** константу newAge нельзя переназначить на новое значение. Попытка сделать это даст ошибку времени компиляции **
источник
«Используйте let для создания константы и var для создания переменной»
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.
https://itun.es/us/jEUH0.lисточник
var - это переменная, которую можно менять сколько угодно раз и когда угодно
например
пусть это константа, которая не может быть изменена
например
источник
Хотя у вас уже есть много различий между let и var, но есть одно главное отличие:
источник
Все в значительной степени ответили на это, но вот способ, которым вы можете вспомнить, что к чему
Пусть всегда будет говорить то же самое о «let», что и let, это работает на этот раз и всегда, как и для переменных «var», которые всегда могут меняться, поэтому их называют переменными
источник
var
это единственный способ создать переменную в Swift.var
не означает динамическую переменную, как в случае интерпретируемых языков, таких как javascript. Например,В этом случае тип переменной
name
подразумевается, что имя имеет типString
, мы также можем создавать переменные, явно определяя тип, напримерТеперь, если вы назначите строку возрасту, то компилятор выдаст ошибку.
let
используется для объявления констант. НапримерИли мы также можем сделать,
Если вы попытаетесь изменить значение city, он выдаст ошибку во время компиляции.
источник
let используется для констант, которые нельзя изменить, тогда как var - обычная переменная
Пример:
let name = «Bob» Что-то вроде name = «Jim» выдаст ошибку, так как константа не может быть изменена.
источник
ПРОСТАЯ РАЗНИЦА
let = (не может быть изменено)
var = (обновление в любое время)
источник
Источник: https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/
Когда вы объявляете переменную с помощью var, это означает, что она может быть обновлена, она является переменной, ее значение может быть изменено.
Когда вы объявляете переменную с помощью let, это означает, что она не может быть обновлена, она не является переменной, ее значение не может быть изменено.
Давайте разберемся с приведенным выше примером: мы создали новую переменную «a» с «ключевым словом var» и присвоили значение «1». Когда я печатаю «a», я получаю вывод как 1. Затем я присваиваю 2 «var a», т.е. я изменяю значение переменной «a». Я могу сделать это без получения ошибки компилятора, потому что я объявил его как var.
Во втором сценарии я создал новую переменную «b» с «ключевым словом let» и присвоил значение «4». Когда я печатаю «b», я получаю 4 в качестве вывода. Затем я пытаюсь присвоить 5 «let b», т.е. я пытаюсь изменить переменную «let», и я получаю ошибку времени компиляции «Невозможно присвоить значение:« b »является константой« let »».
источник
Хотя в настоящее время я все еще читаю руководство, но я думаю, что это очень близко к
const
указателю C / C ++ . Другими словами, что-то вроде разницы междуchar const*
иchar*
. Компилятор также отказывается обновлять содержимое, а не только переназначение ссылок (указатель).Например, допустим, у вас есть эта структура. Позаботьтесь, что это структура, а не класс. AFAIK, у классов нет понятия неизменного состояния.
Поскольку структуры являются неизменяемыми по умолчанию, необходимо пометить метод мутатора с помощью
mutating
. И поскольку имяaaa1
является константой, вы не можете вызвать какой-либо метод мутатора для него. Это именно то, что мы ожидали от указателей C / C ++.Я полагаю, что это механизм для поддержки некоторой вещи с правильной константой .
источник
Объявите константы с ключевым словом let, а переменные с ключевым словом var.
Объявите несколько констант или несколько переменных в одной строке, разделенных запятыми:
Константы и переменные печати
Вы можете напечатать текущее значение константы или переменной с помощью функции println:
Swift использует строковую интерполяцию, чтобы включить имя константы или переменной в качестве заполнителя в более длинной строке
Оберните имя в круглых скобках и экранируйте его обратной косой чертой перед открывающей скобкой:
Ссылка: http://iosswift.com.au/?p=17
источник
Нашел хороший ответ, надеюсь, это поможет :)
источник
let
не означает, что объект является неизменным, это означает, что указатель является неизменным. Чтобы получить эквивалентную функциональность в Obj-C, вам нужно использоватьNSObject *const myObject = someobject;
- Свойства такого объекта могут быть изменены, но указательmyObject
не может быть изменен, чтобы указывать на другой объект.const pointer
что не может быть изменено в будущем, но его ценность может быть. Вы не можете повторно инициализировать его, но можете использовать его как хотите.