Cannot use instance member 'foo' within property initializer; property initializers run before 'self' is available

TimmyDuese

Cadet 4th Year
Registriert
Apr. 2022
Beiträge
114
Habe das folgende Struct
Swift:
struct Calculates{

    func compareDates(currentDate: String, destinationDate : String) -> Int {
        
        let formatter = DateFormatter()
        formatter.dateFormat = "dd.MM.yyyy"
        let currentDate = formatter.date(from: currentDate)
        let destinationDate = formatter.date(from: destinationDate)
        
        let difference = Calendar.current.dateComponents([.year], from: currentDate!, to: destinationDate!)
                      
        return difference.year!
    }
 }

Nun möchte ich über die Funktion den Wert in der View setzen.
Swift:
struct statistikView: View {
   var calculate = Calculates()
        
    var foo = calculate.compareDates(currentDate: "27.06.1982", destinationDate: "27.06.1987")
    
    var body: some View {
    
            Text("\(foo)")
        }
    
}

Allerdings bekomme ich die Fehlermeldung:
Code:
Cannot use instance member 'foo' within property initializer; property initializers run before 'self' is available

Kann mir bitte jemand erklären warum das so ist und wie ich den Fehler beheben kann.
 
Die Meldung sagt es doch aus.

body ist eine property. Die wird Initialisiert, bevor das Struct (self) da ist. Bei der Initialisierung versuchst du auf eine andere Property aus dem Struct zuzugreifen (foo, in Zeile 8). Das geht halt nicht. Muss man einfach so hinnehmen.
Mit foo und calculate passiert denke ich dasselbe, bekommst du quasi die gleiche Meldung, (mit calculate) wenn "var body" fehlt bzw. die Zeile 8 fehlt?

Wie man es ändern kann? Vernünfitge Architektur. Bei dem Code ist eine vernünftige Beratung schwer.
 
Die Fehlermeldung bekomme ich ja bei Zeile 4, da greife ich ja noch gar nicht auf die Property body zu.

Wenn du meinst das mein Code nicht vernünftig ist, was sollte ich ändern?
 
Also dass du foo nicht intialiseren kannst ist aus dem selben Grund logisch: Der Zugriff auf calculate ist nicht möglich.

Und ob dir einfach die falsche Zeile markiert wird oder die Property, auf die illegal zugegriffen wird, kann ich dir nicht sagen. Normal würde ich ersteres erwarten. Dann ist die Formulierung halt merkwürdig: "Cannot use instance member 'foo' within property initializer"

Und was schlecht ist: Quasi jede Bezeichnung, außer body. Aber wenn man nicht weiß, was das dein Ziel ist, kann man nur schlecht sagen, was besser geht... momentan würde ich Zeilen 2 und 4 einfach zwischen Zeile 6 und 8 packen...
 
Danke, mein Problem habe ich jetzt verstanden. Werde mal noch ein paar weitere Lektionen zu diesem Thema durcharbeiten.
 
Zurück
Oben