Jaka jest różnica między let
i var
w języku Apple Swift?
W moim rozumieniu jest to język skompilowany, ale nie sprawdza on typu w czasie kompilacji. To mnie dezorientuje. Skąd kompilator wie o błędzie typu? Jeśli kompilator nie sprawdza typu, czy nie jest to problem ze środowiskiem produkcyjnym?
Odpowiedzi:
let
Kluczowe definiuje stały:Nie
theAnswer
można później zmienić. Dlatego nicweak
nie można napisać przy użyciulet
. Muszą się zmienić w czasie wykonywania i musisz ich używaćvar
.var
Definiuje zmienną zwykłych.Co ciekawe:
Kolejna dziwna funkcja:
Fragmenty: Apple Inc. „Swift Programming Language”. iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
EDYTOWAĆ
Ponieważ komentarze z prośbą o dodanie innych faktów do odpowiedzi, konwersja do odpowiedzi społeczności wiki . Edytuj odpowiedź, aby była lepsza.
źródło
auto 🐶🐮 = "dogcow";
działa w C ++ dla clang.if 😍 === 💝 { 💔 = ♠︎ }
:);)Według The Swift Programming Language Book
Oba
var
ilet
są odniesieniami , dlategolet
jest stałym odniesieniem . Używanie podstawowych typów tak naprawdę nie pokazuje, czymlet
się różniconst
. Różnica pojawia się podczas korzystania z instancji klasy (typy referencyjne):źródło
var
ilet
nie mają nic wspólnego z tym, czy związany identyfikator jest odniesieniem, czy nie. Jeśli typ jeststruct
typem, jest koncepcyjnie wartością. Jeśli typ jestclass
, jest koncepcyjnie referencją, a referencja jest stała, jeślilet
jest używana. GdybyCTest
był strukturą, żadne z twoichletTest
zadań nie działałoby.struct
wartości, nie ma w nim nic konceptualnego. To samo dotyczyclass
- typu odniesienia. Podczas modyfikowania typu wartości tworzysz nową instancję tego typu. developer.apple.com/swift/blog/?id=10 Więc oczywiście nie możesz modyfikować pól / właściwościlet
powiązanych z typem wartości.let
służy do definiowania stałych ivar
definiowania zmiennych.źródło
Być może lepiej jest określić tę różnicę za pomocą pojęcia Mutability / Unmutability, który jest prawidłowym paradygmatem zmienności wartości i instancji w przestrzeni Objects, która jest większa niż jedyne zwykłe pojęcia „stała / zmienna”. Co więcej, jest to bliższe podejściu do celu C.
2 typy danych: typ wartości i typ odniesienia.
W kontekście typów wartości:
„let” określa stałą wartość (nieokiełznaną). „var” definiuje wartość zmienną (zmienną).
W kontekście typów referencyjnych:
Etykieta danych nie jest wartością, ale odniesieniem do wartości.
jeśli aPerson = Osoba (imię: Foo, najpierw: Bar)
Osoba nie zawiera danych tej osoby, ale odniesienie do danych tej osoby.
źródło
aPerson
masz setery, możesz zmodyfikować jego właściwości, prawda? więclet
nie czyniPerson
niezmiennego.The
Sekcja Deklarowanie stałych i zmiennych w dokumentacji Swift Programming Language określa:
Upewnij się, że rozumiesz, jak to działa w przypadku typów referencyjnych. W przeciwieństwie do typów wartości, podstawowe właściwości obiektu mogą ulec zmianie pomimo wystąpienia deklaracji typu odwołania jako stałej. Zobacz sekcję Klasy są typami referencyjnymi w dokumentacji i spójrz na przykład, w którym zmieniają właściwość frameRate.
źródło
Bardzo prosta:
let
jest stały.var
jest dynamiczny.Trochę opisu:
let
tworzy stałą. (trochę jakNSString
). Nie możesz zmienić jego wartości po jej ustawieniu. Nadal możesz go dodawać do innych rzeczy i tworzyć nowe zmienne.var
tworzy zmienną. (coś w styluNSMutableString
), abyś mógł zmienić jego wartość. Ale na to kilka razy odpowiedziano.źródło
let
definiuje „stałą”. Jego wartość jest ustawiana raz i tylko raz, choć niekoniecznie podczas jej deklarowania. Na przykład można użyćlet
do zdefiniowania właściwości w klasie, którą należy ustawić podczas inicjalizacji:Przy tej konfiguracji przypisanie do
firstName
lublastName
po wywołaniu (np.) WPerson(first:"Malcolm", last:"Reynolds")
celu utworzeniaPerson
instancji jest nieprawidłowe .Państwo musi określić typ dla wszystkich zmiennych (
let
lubvar
) w czasie kompilacji, a każdy kod, który próbuje ustawić zmienną może używać tego typu (lub podtyp). Możesz przypisać wartość w czasie wykonywania, ale jej typ musi być znany w czasie kompilacji.źródło
let
-constant
var
-variable
[Stała vs zmienna]
[Strukt vs klasa]
Oficjalny dokument docs.swift.org mówi
Ta terminologia faktycznie opisuje mechanizm zmiany przypisania
Zmienność - zmienna - stan obiektu można zmienić po utworzeniu
Wartość i typ odniesienia [Informacje]
Wartość (struktura, wyliczenie)
Swift
struct
może zmienić swój status zmienności:let
+struct
=immutable
= Stała wartośćTo może nie być przeniesiona lub zmieniona
var
+struct
=mutable
Można go ponownie przypisać lub zmienić
Typ odniesienia (klasa)
Szybkie
classes
sąmutable
a-priorylet
+class
= Stała adresuTo może nie być przeniesiony i może być zmieniona
var
+class
Można go ponownie przypisać lub zmienić
mutating
- Funkcje mutujące strukturyMożesz oznaczyć metodę struct jako
mutating
var
+struct
inout
Modyfikacja struktury w funkcjiMożesz oznaczyć parametr funkcji (który jest struct) jako
inout
Ponieważ
struct
typ wartości jest przekazywany przez wartość, ponieważ funkcja wyniku pobierze kopię. Jeśli zaznaczyszstruct
jakoinout
parametr, oznacza to, że ten parametr staje sięvar
i możesz zmienić stan,struct
a zmiany te będą widoczne poza zakresem funkcjiźródło
Jeszcze jedna różnica, z którą spotkałem się w innych językach dla Constants: nie można zainicjować stałej (let) na później , należy ją zainicjować, gdy masz zamiar zadeklarować stałą.
Na przykład :
Zmienna
źródło
let
służy do deklarowania stałej wartości - nie zmienisz jej po nadaniu jej wartości początkowej.var
służy do deklarowania wartości zmiennej - możesz zmienić jej wartość, jak chcesz.źródło
let służy do definiowania stałych, a var do definiowania zmiennych. Zdefiniujesz ciąg za pomocą var, a następnie określony ciąg można zmodyfikować (lub zmutować), przypisując go do zmiennej (w którym to przypadku można go zmodyfikować), a jeśli zdefiniujesz ciąg za pomocą niech jego stała (w takim przypadku nie może być zmodyfikowany):
źródło
Niech słowo kluczowe definiuje stałą
więc myNum nie może być później zmieniony;
Ale var definiuje zwykłą zmienną.
Wartość stałej nie musi być znana w czasie kompilacji, ale musisz przypisać jej wartość dokładnie raz.
Możesz używać prawie dowolnego znaku, który ci się podoba, dla nazw stałych i zmiennych, w tym znaków Unicode;
na przykład
Ale jeśli weźmiemy to ...
źródło
Jak powiedzieli Luc-Oliver, NullData i kilku innych,
let
definiuje dane niezmienne, avar
dane zmienne. Wszelkie,func
które można wywołać na oznaczonej zmiennej,mutating
można wywołać tylko wtedy, gdy jest onavar
zmienną (kompilator wyrzuci błąd). Dotyczy to takżefunc
tych, które przyjmująinout
zmienną.Jednak
let
ivar
również oznaczać, że zmienna nie może być przeniesiony. Ma dwa znaczenia, oba o bardzo podobnych celachźródło
Wartość var można zmienić po inicjalizacji. Ale niech wartość nie ulegnie zmianie, gdy zostanie raz zilustrowana.
W przypadku var
W przypadku let
źródło
Słowo kluczowe var służy do definiowania zmiennej, której wartość można łatwo zmienić w następujący sposób:
Jednak słowo kluczowe let służy tylko do utworzenia stałej używanej, gdy nie chcesz ponownie zmieniać wartości stałej. Jeśli spróbujesz zmienić wartość stałej, pojawi się błąd:
źródło
Niech jest niezmienną zmienną, co oznacza, że nie można jej zmienić, inne języki nazywają to stałą. W C ++ można go zdefiniować jako const.
Var jest zmienną zmienną, co oznacza, że można ją zmienić. W C ++ (aktualizacja wersji z 2011 r.) Jest to to samo, co używanie auto, chociaż swift pozwala na większą elastyczność w użyciu. Jest to bardziej znany typ zmiennej dla początkujących.
źródło
let jest wartością stałą, więc nigdy nie można jej zmienić.
Var jest zmienną i może się zmieniać (ale po zdefiniowaniu nie należy do innego typu danych).
Jeśli spróbujesz zmienić zmienną na inny typ danych, to nie zadziała
źródło
Główną różnicą jest to, że
var
wartość zmiennej może się zmieniać, alet
nie może. Jeśli chcesz mieć dane wejściowe użytkownika, możesz użyćvar
tej wartości, aby zmienić wartość, i użyćlet
zmiennej typu danych, aby wartość nie mogła zostać zmieniona.źródło
Wartość można przypisać ponownie w przypadku var
** Stała newAge nie może być ponownie przypisana do nowej wartości. Próba zrobienia tego spowoduje błąd czasu kompilacji **
źródło
„Użyj let, aby utworzyć stałą, a var, aby utworzyć zmienną”
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.
https://itun.es/us/jEUH0.lźródło
var jest zmienną, którą można zmieniać tyle razy, ile chcesz i kiedykolwiek
na przykład
let jest stały, którego nie można zmienić
na przykład
źródło
Chociaż masz już wiele różnic między let i var, ale jedna główna różnica to:
źródło
Wszyscy prawie na to odpowiedzieli, ale oto sposób, w jaki możesz zapamiętać, co jest
Powiedzmy zawsze to samo, myśląc o „let”, jak to działa raz i zawsze tak, jak dla zmiennej „var” zawsze można zmienić, stąd nazywamy ją
źródło
var
jest jedynym sposobem szybkiego tworzenia zmiennych.var
nie oznacza zmiennej dynamicznej, jak w przypadku języków interpretowanych, takich jak javascript. Na przykład,W takim przypadku typ zmiennej
name
jest wywnioskowany, że nazwa jest typuString
, możemy również tworzyć zmienne poprzez jawne zdefiniowanie typu, na przykładTeraz, jeśli przypiszesz ciąg do wieku, kompilator wyświetli błąd.
let
służy do deklarowania stałych. Na przykładLub możemy też zrobić,
Próba zmiany wartości miasta powoduje błąd w czasie kompilacji.
źródło
let jest używany dla stałych, których nie można modyfikować, podczas gdy var jest zwykłą zmienną
Przykład:
let name = „Bob” Coś w stylu name = „Jim” zgłosi błąd, ponieważ stałej nie można modyfikować.
źródło
PROSTA RÓŻNICA
let = (nie można zmienić)
var = (dowolna aktualizacja czasu)
źródło
Źródło: https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/
Kiedy deklarujesz zmienną za pomocą var, oznacza to, że może być aktualizowana, jest zmienna, jej wartość może być modyfikowana.
Kiedy deklarujesz zmienną za pomocą let, oznacza to, że nie można jej zaktualizować, nie jest zmienna, jej wartość nie może być modyfikowana.
Rozumiemy powyższy przykład: Stworzyliśmy nową zmienną „a” ze słowem „var słowo kluczowe” i przypisaliśmy wartość „1”. Kiedy wypisuję „a”, otrzymuję wynik jako 1. Następnie przypisuję 2 do „var a”, tj. Modyfikuję wartość zmiennej „a”. Mogę to zrobić bez błędu kompilatora, ponieważ zadeklarowałem go jako var.
W drugim scenariuszu utworzyłem nową zmienną „b” ze słowem „let keyword” i przypisałem wartość „4”. Kiedy drukuję „b”, mam 4 jako wyjście. Następnie próbuję przypisać 5 do „let b”, tj. Próbuję zmodyfikować zmienną „let” i pojawia się błąd czasu kompilacji „Nie można przypisać do wartości:„ b ”jest stałą„ let ”.
źródło
Chociaż obecnie wciąż czytam instrukcję, ale myślę, że jest to bardzo zbliżone do
const
wskaźnika C / C ++ . Innymi słowy, coś w rodzaju różnicy międzychar const*
ichar*
. Kompilator odmawia także aktualizacji treści, a nie tylko zmiany przypisania (wskaźnika).Załóżmy na przykład, że masz taką strukturę. Uważaj, aby to była struktura, a nie klasa. AFAIK, klasy nie mają pojęcia niezmiennego stanu.
Ponieważ struktury są domyślnie niezmienne, musisz oznaczyć metodę mutatora za pomocą
mutating
. A ponieważ nazwaaaa1
jest stała, nie można wywołać żadnej metody mutatora. Dokładnie tego się spodziewaliśmy na wskaźnikach C / C ++.Uważam, że jest to mechanizm wspierający coś w rodzaju stałej poprawności .
źródło
Deklaruj stałe za pomocą słowa kluczowego let i zmienne za pomocą słowa kluczowego var.
Zadeklaruj wiele stałych lub wielu zmiennych w jednym wierszu, oddzielając je przecinkami:
Drukowanie stałych i zmiennych
Możesz wydrukować bieżącą wartość stałej lub zmiennej za pomocą funkcji println:
Swift używa interpolacji ciągów, aby dołączyć nazwę stałej lub zmiennej jako symbol zastępczy w dłuższym ciągu
Zawinąć nazwę w nawiasach i uciec przed odwrotnym ukośnikiem:
Odniesienie: http://iosswift.com.au/?p=17
źródło
Znalazłem dobrą odpowiedź, mam nadzieję, że może pomóc :)
źródło
let
nie oznacza, że obiekt jest niezmienny, oznacza to, że wskaźnik jest niezmienny. Aby uzyskać równoważną funkcjonalność w Obj-C, musisz użyćNSObject *const myObject = someobject;
- Właściwości takiego obiektu można modyfikować, ale wskaźnikamyObject
nie można modyfikować, aby wskazywał na inny obiekt.const pointer
które nie mogą ulec zmianie w przyszłości, ale ich wartość może być. Nie możesz go ponownie zainicjować, ale możesz używać go tak, jak chcesz.