Was ist der Unterschied zwischen let
und var
in Apples Swift-Sprache?
Nach meinem Verständnis handelt es sich um eine kompilierte Sprache, die den Typ jedoch zur Kompilierungszeit nicht überprüft. Es macht mich verwirrt. Woher weiß der Compiler über den Typfehler Bescheid? Wenn der Compiler den Typ nicht überprüft, liegt dann kein Problem mit der Produktionsumgebung vor?
Antworten:
Das
let
Schlüsselwort definiert eine Konstante:Das
theAnswer
kann danach nicht mehr geändert werden. Aus diesem Grundweak
kann nichts mit geschrieben werdenlet
. Sie müssen Laufzeit ändern und müssenvar
stattdessen verwendet werden.Das
var
definiert eine gewöhnliche Variable.Was ist interessant:
Ein weiteres merkwürdiges Merkmal:
Auszüge aus: Apple Inc. "The Swift Programming Language". iBooks.https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
BEARBEITEN
Weil Kommentare, die darum bitten, der Antwort weitere Fakten hinzuzufügen, diese in eine Community-Wiki-Antwort konvertieren . Fühlen Sie sich frei, die Antwort zu bearbeiten, um sie besser zu machen.
quelle
auto 🐶🐮 = "dogcow";
in C ++ für Clang.if 😍 === 💝 { 💔 = ♠︎ }
Laut dem Swift Programming Language Book
Beide
var
undlet
sind Referenzen , daherlet
ist eine konstante Referenz . Die Verwendung grundlegender Typen zeigt nicht wirklich, wielet
sich das von unterscheidetconst
. Der Unterschied ergibt sich bei der Verwendung mit Klasseninstanzen (Referenztypen):quelle
var
undlet
haben nichts damit zu tun, ob der gebundene Bezeichner eine Referenz ist oder nicht. Wenn der Typ einstruct
Typ ist, ist er konzeptionell ein Wert. Wenn der Typ a ist, handeltclass
es sich konzeptionell um eine Referenz, und die Referenz ist eine Konstante, wenn sielet
verwendet wird. WennCTest
eine Struktur wäre, würde keine IhrerletTest
Aufgaben funktionieren.struct
Wertetyp handelt, ist nichts Konzeptionelles daran. Das gleiche mitclass
- Referenztyp. Wenn Sie einen Werttyp ändern, erstellen Sie eine neue Instanz dieses Typs. developer.apple.com/swift/blog/?id=10 Sie können also offensichtlich keine Felder / Eigenschaften ändern, die an einen Werttyplet
gebunden sind.let
wird verwendet, um Konstanten undvar
Variablen zu definieren.quelle
Es ist vielleicht besser, diesen Unterschied durch den Begriff der Veränderbarkeit / Unveränderlichkeit zu erklären, der das richtige Paradigma für die Veränderbarkeit von Werten und Instanzen im Objektraum ist, das größer ist als die einzigen üblichen Begriffe "Konstante / Variable". Darüber hinaus kommt dies dem Ziel-C-Ansatz näher.
2 Datentypen: Werttyp und Referenztyp.
Im Kontext von Werttypen:
'let' definiert einen konstanten Wert (nicht zähmbar). 'var' definiert einen veränderbaren Wert (veränderlich).
Im Zusammenhang mit Referenztypen:
Die Bezeichnung von Daten ist nicht der Wert, sondern der Verweis auf einen Wert.
wenn aPerson = Person (Name: Foo, zuerst: Bar)
aPerson enthält nicht die Daten dieser Person, sondern den Verweis auf die Daten dieser Person.
quelle
aPerson
es Setter gibt, können Sie die Eigenschaften ändern, oder? daslet
macht das also nichtPerson
unveränderlich.Das
Der Abschnitt Deklarieren von Konstanten und Variablen in der Dokumentation zur Swift-Programmiersprache enthält Folgendes:
Stellen Sie sicher, dass Sie verstehen, wie dies für Referenztypen funktioniert. Im Gegensatz zu Werttypen können sich die zugrunde liegenden Eigenschaften des Objekts ändern, obwohl eine Instanz eines Referenztyps als Konstante deklariert wird. Weitere Informationen finden Sie im Abschnitt Klassen sind Referenztypen in der Dokumentation. Sehen Sie sich das Beispiel an, in dem sie die Eigenschaft frameRate ändern.
quelle
Sehr einfach:
let
ist konstant.var
ist dynamisch.Beschreibung:
let
schafft eine Konstante. (irgendwie wie einNSString
). Sie können den Wert nicht mehr ändern, nachdem Sie ihn festgelegt haben. Sie können es dennoch zu anderen Dingen hinzufügen und neue Variablen erstellen.var
erstellt eine Variable. (so ähnlichNSMutableString
), damit Sie den Wert ändern können. Dies wurde jedoch mehrfach beantwortet.quelle
let
definiert eine "Konstante". Sein Wert wird einmal und nur einmal festgelegt, jedoch nicht unbedingt, wenn Sie ihn deklarieren. Beispielsweiselet
definieren Sie eine Eigenschaft in einer Klasse, die während der Initialisierung festgelegt werden muss:Bei diesem Setup ist es ungültig,
firstName
oderlastName
nach dem Aufruf (z. B.)Person(first:"Malcolm", last:"Reynolds")
einePerson
Instanz zu erstellen .Sie müssen zum Zeitpunkt der Kompilierung einen Typ für alle Variablen (
let
odervar
) definieren , und jeder Code, der versucht, eine Variable festzulegen , verwendet möglicherweise nur diesen Typ (oder einen Subtyp). Sie können zur Laufzeit einen Wert zuweisen , dessen Typ jedoch zur Kompilierungszeit bekannt sein muss.quelle
let
-constant
var
-variable
[Konstante gegen Variable]
[Struktur gegen Klasse]
Offizielle doc docs.swift.org sagt
Diese Terminologie beschreibt eigentlich eine Umhängen Mechanismus
Veränderbarkeit - veränderbar - Der Status des Objekts kann nach der Erstellung geändert werden
Wert und Referenztyp [Info]
Wert (Struktur, Aufzählung)
Swifts
struct
können ihren Veränderbarkeitsstatus ändern:let
+struct
=immutable
= WertekonstanteSie kann nicht neu zugewiesen oder geändert werden
var
+struct
=mutable
Es kann neu zugewiesen oder geändert werden
Referenztyp (Klasse)
Swifts
classes
sindmutable
ein Prioratlet
+class
= AdresskonstanteSie kann nicht neu zugewiesen und geändert werden
var
+class
Es kann neu zugewiesen oder geändert werden
mutating
- Funktionen von Mutating StructSie können die Methode einer Struktur als markieren
mutating
var
+ verwendet werdenstruct
inout
Struktur innerhalb einer Funktion ändernSie können den Parameter einer Funktion (der struct ist) als markieren
inout
Da
struct
ein Werttyp als Wert übergeben wird, ruft die Ergebnisfunktion eine Kopie ab. Wenn Sie einenstruct
alsinout
Parameter markieren , bedeutet dies, dass dieser Parameter wirdvar
und Sie einen Status von ändern könnenstruct
und diese Änderungen außerhalb des Funktionsumfangs sichtbar sindquelle
Ein weiterer Unterschied, den ich in anderen Sprachen für Konstanten festgestellt habe, ist: Ich kann die Konstante nicht für später initialisieren (let) , sollte initialisiert werden, wenn Sie die Konstante deklarieren möchten.
Zum Beispiel :
Variable
quelle
let
wird verwendet, um einen konstanten Wert zu deklarieren - Sie werden ihn nicht ändern, nachdem Sie ihm einen Anfangswert gegeben haben.var
wird verwendet, um einen variablen Wert zu deklarieren - Sie können seinen Wert nach Belieben ändern.quelle
let wird verwendet, um Konstanten zu definieren, und var , um Variablen zu definieren. Sie definieren die Zeichenfolge mit var, dann kann eine bestimmteZeichenfolgegeändert (oder mutiert) werden, indem Sie sie einer Variablen zuweisen (in diesem Fall kann sie geändert werden). Wenn Sie die Zeichenfolge mit let definieren , ist sie eine Konstante (in diesem Fall kann sie nicht sein) geändert):
quelle
Das Schlüsselwort let definiert eine Konstante
Daher kann myNum danach nicht mehr geändert werden.
Aber var definiert eine gewöhnliche Variable.
Der Wert einer Konstante muss zur Kompilierungszeit nicht bekannt sein, aber Sie müssen ihr genau einmal einen Wert zuweisen.
Sie können fast jedes beliebige Zeichen für Konstanten- und Variablennamen verwenden, einschließlich Unicode-Zeichen.
z.B
Aber wenn wir nehmen dann ...
quelle
Wie Luc-Oliver definieren NullData und einige andere hier
let
unveränderliche Daten, während sievar
veränderbare Daten definieren. Alle Elementefunc
, die für die markierte Variable aufgerufen werden können,mutating
können nur aufgerufen werden, wenn es sich um einevar
Variable handelt (der Compiler gibt einen Fehler aus). das gilt auch fürfunc
's, die eineinout
Variable aufnehmen.Allerdings ,
let
undvar
auch bedeuten , dass der Variable nicht neu zugeordnet werden kann. Es hat zwei Bedeutungen, beide mit sehr ähnlichen Zweckenquelle
Der var- Wert kann nach der Initialisierung geändert werden. Aber lassen Sie den Wert nicht ändern, wenn er einmal intilisiert wird.
Im Falle von var
Im Falle von vermieten
quelle
Mit dem Schlüsselwort var wird eine Variable definiert, deren Wert Sie wie folgt leicht ändern können:
Das Schlüsselwort let dient jedoch nur zum Erstellen einer Konstante, die verwendet wird, wenn Sie den Wert der Konstante nicht erneut ändern möchten. Wenn Sie versuchen, den Wert der Konstante zu ändern, wird folgende Fehlermeldung angezeigt:
quelle
Let ist eine unveränderliche Variable, was bedeutet, dass sie nicht geändert werden kann. Andere Sprachen nennen dies eine Konstante. In C ++ können Sie es als const definieren.
Var ist eine veränderbare Variable, was bedeutet, dass sie geändert werden kann. In C ++ (Versionsaktualisierung 2011) entspricht dies der Verwendung von auto, obwohl swift mehr Flexibilität bei der Verwendung ermöglicht. Dies ist der bekanntere Variablentyp für Anfänger.
quelle
let ist ein konstanter Wert, daher kann er niemals geändert werden.
Var ist eine Variable und kann sich ändern (aber nachdem sie nicht für einen anderen Datentyp definiert wurde).
Wenn Sie versuchen, die Variable in einen anderen Datentyp zu ändern, funktioniert dies nicht
quelle
Der Hauptunterschied besteht darin, dass sich der
var
Variablenwert ändern kann undlet
nicht. Wenn Sie Benutzereingabedaten haben möchten, verwenden Sie diese,var
damit der Wert geändert werden kann, und verwenden Sie dielet
Datentypvariable, damit der Wert nicht geändert werden kann.quelle
Bei var kann ein Wert neu zugewiesen werden
** Die newAge-Konstante kann keinem neuen Wert zugewiesen werden. Wenn Sie dies versuchen, wird ein Fehler bei der Kompilierung angezeigt **
quelle
"Verwenden Sie let, um eine Konstante zu erstellen, und var, um eine Variable zu erstellen."
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks.
https://itun.es/us/jEUH0.lquelle
var ist eine Variable, die beliebig oft und jederzeit geändert werden kann
zum Beispiel
Lassen ist eine Konstante, die nicht geändert werden kann
zum Beispiel
quelle
Obwohl Sie bereits viele Unterschiede zwischen let und var haben, ist ein Hauptunterschied:
quelle
Jeder hat so ziemlich darauf geantwortet, aber hier ist eine Möglichkeit, sich daran zu erinnern, was was ist
Lassen Sie uns immer den gleichen Gedanken an "let" sagen, wie dies einmal funktionieren soll, und immer, wenn sich "var" -Variablen ändern können, werden sie daher als Variablen bezeichnet
quelle
var
Nur so können Sie schnell Variablen erstellen.var
bedeutet nicht dynamische Variable wie im Fall von interpretierten Sprachen wie Javascript. Zum Beispiel,In diesem Fall wird auf den Variablentyp geschlossen
name
, dass der Name vom TypString
ist. Wir können Variablen auch erstellen, indem wir beispielsweise den Typ explizit definierenWenn Sie nun age eine Zeichenfolge zuweisen, gibt der Compiler den Fehler aus.
let
wird verwendet, um Konstanten zu deklarieren. Zum BeispielOder wir können auch tun,
Wenn Sie versuchen, den Wert von city zu ändern, tritt beim Kompilieren ein Fehler auf.
quelle
let wird für Konstanten verwendet, die nicht geändert werden können, während var eine gewöhnliche Variable ist
Beispiel:
let name = "Bob" So etwas wie name = "Jim" löst einen Fehler aus, da eine Konstante nicht geändert werden kann.
quelle
EINFACHER UNTERSCHIED
let = (kann nicht geändert werden)
var = (jederzeit aktualisiert)
quelle
Quelle: https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/
Wenn Sie eine Variable mit var deklarieren, bedeutet dies, dass sie aktualisiert werden kann, dass sie variabel ist und dass ihr Wert geändert werden kann.
Wenn Sie eine Variable mit let deklarieren, bedeutet dies, dass sie nicht aktualisiert werden kann, nicht variabel ist und dass ihr Wert nicht geändert werden kann.
Lassen Sie uns das obige Beispiel verstehen: Wir haben eine neue Variable "a" mit dem Schlüsselwort "var" erstellt und den Wert "1" zugewiesen. Wenn ich "a" drucke, erhalte ich die Ausgabe als 1. Dann weise ich "var a" 2 zu, dh ich ändere den Wert der Variablen "a". Ich kann es tun, ohne einen Compilerfehler zu bekommen, weil ich es als var deklariert habe.
Im zweiten Szenario habe ich eine neue Variable "b" mit dem Schlüsselwort "let" erstellt und den Wert "4" zugewiesen. Wenn ich "b" drucke, bekomme ich 4 als Ausgabe. Dann versuche ich, "let b" 5 zuzuweisen, dh ich versuche, die Variable "let" zu ändern, und ich erhalte den Fehler "Kompilierungszeit kann nicht dem Wert zugewiesen werden: 'b' ist eine 'let'-Konstante".
quelle
Derzeit lese ich zwar noch das Handbuch, aber ich denke, dies kommt dem C / C ++ -
const
Zeiger sehr nahe . Mit anderen Worten, so etwas wie ein Unterschied zwischenchar const*
undchar*
. Der Compiler weigert sich auch, Inhalte zu aktualisieren, nicht nur die Neuzuweisung von Referenzen (Zeiger).Angenommen, Sie haben diese Struktur. Achten Sie darauf, dass dies eine Struktur ist, keine Klasse. AFAIK, Klassen haben kein Konzept von unveränderlichem Zustand.
Da die Strukturen standardmäßig unveränderlich sind, müssen Sie eine Mutatormethode mit markieren
mutating
. Und weil der Nameaaa1
konstant ist, können Sie keine Mutator-Methode dafür aufrufen. Dies ist genau das, was wir von C / C ++ - Zeigern erwartet haben.Ich glaube, dies ist ein Mechanismus, um eine Art Konstanzkorrektheit zu unterstützen .
quelle
Deklarieren Sie Konstanten mit dem Schlüsselwort let und Variablen mit dem Schlüsselwort var.
Deklarieren Sie mehrere Konstanten oder mehrere Variablen in einer einzelnen Zeile, die durch Kommas getrennt sind:
Konstanten und Variablen drucken
Sie können den aktuellen Wert einer Konstanten oder Variablen mit der Funktion println drucken:
Swift verwendet die Zeichenfolgeninterpolation, um den Namen einer Konstanten oder Variablen als Platzhalter in eine längere Zeichenfolge aufzunehmen
Wickeln Sie den Namen in Klammern und schließen Sie ihn mit einem Backslash vor der öffnenden Klammer an:
Referenz: http://iosswift.com.au/?p=17
quelle
Habe eine gute Antwort gefunden, hoffe es kann helfen :)
quelle
let
bedeutet nicht, dass das Objekt unveränderlich ist, sondern dass der Zeiger unveränderlich ist. Um die entsprechende Funktionalität in Obj-C zu erhalten, müssen Sie Folgendes verwenden:NSObject *const myObject = someobject;
- Die Eigenschaften eines solchen Objekts können geändert werden, der ZeigermyObject
kann jedoch nicht so geändert werden, dass er auf ein anderes Objekt zeigt.const pointer
die sich in Zukunft nicht ändern können, aber deren Wert sein kann. Sie können es nicht neu initialisieren, aber Sie können es verwenden, wie Sie möchten.