Die Linie
self.clubLevel = try container.decode(ClubLevel?.self, forKey: .clubLevel)
versucht nicht ClubLevel
zu dekodieren, nil
wenn nicht erfolgreich zuweisen. Was sie tut, ist:
- Try
nil
(dargestellt in JSON als null
) für die clubLevel
Schlüssel zu entschlüsseln. Wenn nicht erfolgreich,
- Versuchen Sie, einen
ClubLevel
für den Schlüssel clubLevel
zu decodieren. Wenn dies nicht erfolgreich,
- Werfen Sie einen Fehler
Also, wenn der Wert für die clubLevel
Schlüssel ist weder nil
noch eine gültige ClubLevel
Darstellung, werden Sie einen Fehler geworfen. Sie werden feststellen, dass dies auch bedeutet, dass Sie eine Fehlermeldung erhalten, wenn der Schlüssel clubLevel
vollständig fehlt (anstatt mit einem Wert von nil
vorhanden zu sein).
fehlende Schlüssel Ignoriert wird mit decodeIfPresent
getan:
self.clubLevel = try container.decodeIfPresent(ClubLevel.self, forKey: .clubLevel)
Dies wird nun:
- Return
nil
wenn die clubLevel
Schlüssel aus dem Behälter fehlen. Wenn der Schlüssel vorhanden ist,
- Versuchen Sie,
nil
(in JSON als null
dargestellt) für den Schlüssel clubLevel
zu decodieren. Wenn nicht erfolgreich,
- Versuchen Sie, einen
ClubLevel
für den Schlüssel clubLevel
zu decodieren. Wenn dies nicht erfolgreich,
- Werfen Sie einen Fehler
Dies ist das Standardverhalten für die Decodierung optionals in einem Compiler generierte Implementierung von init(from:)
. Es wird immer noch einen Fehler in Ihrem Fall auslösen, da der Wert für den Schlüssel clubLevel
kein gültiger ClubLevel
ist.
Wenn Sie wollen einfach nur versuchen, ein ClubLevel
zu dekodieren, nil
auf dem Dekodierung Zuweisung für jeden Grund (Schlüssel fehlt, ungültigen Wert andernfalls, usw.), dann möchten Sie verwenden try?
:
self.clubLevel = try? container.decode(ClubLevel.self, forKey: .clubLevel)
danke für Ihren Kommentar @hamish können Sie erklären, was Unterschied zwischen 'versuchen? container.decode (ClubLevel.self, forKey: .clubLevel) 'und' try container.decode (ClubLevel? .self, forKey: .clubLevel) '. Sie können Ihren Kommentar als Antwort –