Wie kann ich mit diesem Fehler umgehen, ohne eine zusätzliche Variable zu erstellen?
func reduceToZero(x:Int) -> Int {
while (x != 0) {
x = x-1 // ERROR: cannot assign to 'let' value 'x'
}
return x
}
Ich möchte keine zusätzliche Variable erstellen, nur um den Wert von x zu speichern. Kann ich überhaupt machen, was ich will?
swift
syntax
immutability
mutability
Gabriel
quelle
quelle
Antworten:
Wie in anderen Antworten angegeben, wird ab Swift 3 var platziert, bevor eine Variable veraltet ist. Obwohl in anderen Antworten nicht angegeben, ist die Möglichkeit, einen
inout
Parameter zu deklarieren . Denken Sie: einen Zeiger übergeben.Dies kann besonders bei der Rekursion nützlich sein.
Die
inout
Deklarationsrichtlinien von Apple finden Sie hier .quelle
inout
Das Schlüsselwort sollte wie folgt zwischen Parametername und Parametertyp platziert werden:func reduceToZero(x: inout Int)
in der aktuellen Swift 3-Version.Für Swift 1 und 2 (für Swift 3 siehe Antwort von achi mit einem inout-Parameter): Das Argument einer Funktion in Swift ist
let
standardmäßig. Ändern Sie es daher in,var
wenn Sie den Wert ändern müssen, z.quelle
var
in Parametern wird sehr wahrscheinlich in neueren Swift-Versionen per github.com/apple/swift-evolution/blob/master/proposals/…'var'-Parameter sind veraltet und werden in Swift 3 entfernt. Die Zuweisung zu einem neuen Parameter scheint jetzt der beste Weg zu sein:
wie hier erwähnt: 'var'-Parameter sind veraltet und werden in Swift 3 entfernt
quelle
x
das Neuevar x
? Oder macht Swift etwas effizienteres?x
passt in das Register) fallen praktisch keine Kosten an. Wennx
ein Array, eine Struktur oder ein Objekt mutiert ist, muss mit ziemlicher Sicherheit eine Kopie ausgeführt werden (es sei denn, der Optimierer kann sie inline analysieren und als Alias verwenden).var
Argumente als die Verwendung,inout
die unbeabsichtigte Nebenwirkungen haben kann, insb. wenn die var ein Zeiger war.Swift3-Antwort für die Übergabe eines veränderbaren Array-Zeigers.
Funktion:
Aufruf zur Funktion:
quelle
In Swift fügen Sie einfach das
var
Schlüsselwort vor dem Variablennamen in die Funktionsdeklaration ein:Weitere Informationen finden Sie im Unterabschnitt "Konstante und variable Parameter" im Kapitel "Funktionen" des Swift-Buches (Seite 210 des heutigen iBook).
quelle
Es gibt einige Fälle, in denen wir nicht verwendet haben
inout
Wir können so etwas verwenden, wenn Sie möchten, dass sich Änderungen / Umfang nur innerhalb der Funktion befinden:
quelle
Lösung mit Swift5 mit funktionaler Programmierung ...
quelle