ThisIsBeat schrieb:
Also einmal hast du die Variable items zu folgendem geändert. Ich meine mit dem ersten RootElement in items, gibst du den Type an. RootElement() ist dann der Defaultwert. Doch warum habe ich dann keine Optional-Prüfung mehr ?
items
nun nicht mehr den Typ RootElement?
, sondern den Typ RootElement
hat, also kein „Optional“ mehr ist. Zum Thema „Optionals“ hatte ich hier schon mal was geschrieben.RootElement()
erzeugt eine Instanz vom Typ RootElement
, denn nicht optionale Variablen müssen initialisiert werden.ThisIsBeat schrieb:
Dann sehe ich hast du die Optionals für let url und let data mit Guard gelöst
Optional.none
ist.ThisIsBeat schrieb:
self.items = (try? decoder.decode(RootElement.self, from: data)) ?? RootElement()
Du hast ja in dem Kommentar dazu geschrieben das RootElement im Fall der Fälle als Defaultwert dient. Doch was genau ?
try!
würde wieder das Programm abstürzen lassen, deshalb habe ich try?
verwendet. Das hat aber zur Folge, dass der try?-Ausdruck den Typ RootElement?
(Optional<RootElement>) ergibt, also auch nil
sein kann. Die Variable items
ist aber jetzt vom Typ RootElement
und darf deshalb kein nil
zugewiesen werden. Da kommt dann der „Nil-Coalescing Operator“ ??
ins Spiel, der dann einfach eine neue Instanz vom Typ RootElement
zurück gibt.ThisIsBeat schrieb:
Also woran ist es dann im wesentlichen bei mir gescheitert ? Daran das ich Optionals verwendet habe, es durch den asynchronen dataTask keine greifbaren Daten gab und die App dann gecrasht ist ?
return (self.items?.data?.count)!
Das Problem ist rot markiert. So lange die Daten noch (asynchron) geladen und decodiert werden entspricht die Zeile folgendem:
return (nil)!
Und dann macht's halt bumm.