Erstens: die defer
wird ausgeführt, wie Sie deutlich sehen können, wenn Sie eine print(str)
hinzufügen. Jetzt
zu erklären, warum der zurückgegebene Wert nicht den geänderten Wert widerspiegelt:
Der Grund dafür ist, dass String
unveränderlich ist - wann immer Sie str += something
schreiben Sie eine völlig neue String
Instanz erstellen und speichern es in str
.
Wenn Sie return str
schreiben, wird die aktuelle Instanz str
zurückgegeben, die 123yyy4
lautet. Dann wird der defer
aufgerufen und der String
123yyy4xxx
dem str
das völlig neue und nicht verwandte zugewiesen. Aber das ändert nichts an dem vorherigen String
Objekt, das in str
gespeichert ist, es überschreibt es einfach und beeinflusst daher nicht die return
, die bereits "passiert" ist.
Wenn Sie Ihre Methode ändern NSMutableString
stattdessen verwenden Sie auf der gleichen Instanz und das Ergebnis wird daher korrekt ausgegeben 123yyy4xxx
immer funktionieren wird:
func branch() -> NSMutableString {
var str = NSMutableString()
defer { str.appendString("xxx") }
str.appendString("1")
let counter = 3;
if counter > 0 {
str.appendString("2")
defer { str.appendString("yyy") }
str.appendString("3")
}
str.appendString("4")
return str
}
let bran1 = branch()
In diesem Code gibt die Rückkehr der in str
gespeichert Instanz und der Defer ändert das instance, es weist keine neue Instanz zu, aber ändert die bereits vorhandene.
Zur Erläuterung halber können Sie versuchen, die Speicheradresse str
in verschiedenen Stadien zu lesen:
- zum Zeitpunkt der
return
- vor
str
im defer
Block
- , nachdem es
-Änderungs
Für die NSMutableString
alle drei Fälle ergeben die gleiche Speicheradresse maintin g dass die Instanz gleich bleibt. Die Datei String
gibt jedoch zwei verschiedene Speicheradressen aus, was dazu führt, dass die zurückgegebene Zeichenfolge auf someAddress
und die zurückgesetzte auf someOtherAddress
zeigt.
es funktioniert, aber die 'defer' aufgerufen wird _after_ der Umfang abläuft, also zunächst die 'return str' wird aufgerufen, dann läuft der scope aus und es ruft den' defer' auf und fügt das '" xxx "' zu der lokalen Instanz hinzu, die _ nach der Rückgabe des Wertes passiert. – holex