Da sich das Verhalten von lazy
in Swift 4 geändert hat , habe ich einige struct
s geschrieben, die ein sehr spezifisches Verhalten ergeben, das sich zwischen den Sprachversionen niemals ändern sollte. Ich habe diese auf GitHub unter der BH-1-PD- Lizenz bereitgestellt : https://github.com/RougeWare/Swift-Lazy-Patterns
Hier ist die für diese Frage relevante, mit der Sie einen Wert träge initialisieren, diesen Wert zwischenspeichern und zerstören können, damit er später träge neu initialisiert werden kann.
Beachten Sie, dass dies Swift 5.1 erfordert! Für die Swift 4-Version siehe Version 1.1.1 dieses Repos .
Die einfache Verwendung ist sehr einfach:
@ResettableLazy
var myLazyString = "Hello, lazy!"
print(myLazyString)
print(myLazyString)
_myLazyString.clear()
print(myLazyString)
print(myLazyString)
myLazyString = "Overwritten"
print(myLazyString)
_myLazyString.clear()
print(myLazyString.wrappedValue)
Dies wird gedruckt:
Hello, lazy!
Hello, lazy!
Hello, lazy!
Hello, lazy!
Overwritten
Hello, lazy!
Wenn Sie über eine komplexe Initialisierungslogik verfügen, können Sie diese an den Eigenschaften-Wrapper übergeben:
func makeLazyString() -> String {
print("Initializer side-effect")
return "Hello, lazy!"
}
@ResettableLazy(initializer: makeLazyString)
var myLazyString: String
print(myLazyString)
print(myLazyString)
_myLazyString.clear()
print(myLazyString)
print(myLazyString)
myLazyString = "Overwritten"
print(myLazyString)
_myLazyString.clear()
print(myLazyString.wrappedValue)
Sie können es auch direkt verwenden (als Property Wrapper installiert):
var myLazyString = ResettableLazy<String>() {
print("Initializer side-effect")
return "Hello, lazy!"
}
print(myLazyString.wrappedValue)
print(myLazyString.wrappedValue)
myLazyString.clear()
print(myLazyString.wrappedValue)
print(myLazyString.wrappedValue)
myLazyString.wrappedValue = "Overwritten"
print(myLazyString.wrappedValue)
_myLazyString.clear()
print(myLazyString.wrappedValue)
Diese werden beide gedruckt:
Initializer side-effect
Hello, lazy!
Hello, lazy!
Initializer side-effect
Hello, lazy!
Hello, lazy!
Overwritten
Initializer side-effect
Hello, lazy!
Diese Antwort wurde aktualisiert. Die ursprüngliche Lösung funktioniert nicht mehr in Swift 4 und höher.
Stattdessen empfehle ich Ihnen, eine der oben aufgeführten Lösungen oder die Lösung von @ PBosman zu verwenden
Zuvor hing diese Antwort vom Verhalten ab, das ein Fehler war. Sowohl diese alte Version dieser Antwort als auch ihr Verhalten und warum es sich um einen Fehler handelt, werden im Text und in den Kommentaren des Swift-Fehlers SR-5172 (der ab dem 14.07.2017 mit PR # 10.911 behoben wurde ) beschrieben, und es ist klar dass dieses Verhalten nie beabsichtigt war.
Diese Lösung befindet sich im Text dieses Swift-Fehlers und auch im Verlauf dieser Antwort . Da es sich jedoch um einen Fehler-Exploit handelt, der in Swift 3.2+ nicht funktioniert, empfehle ich, dies nicht zu tun.
Clinet
undClinetSession
absichtlich oder ist es ein Tippfehler?