The line
self.clubLevel = try container.decode(ClubLevel?.self, forKey: .clubLevel)
doesn't try to decode ClubLevel
, assigning nil
if unsuccessful. What it does is:
- Try to decode
nil
(represented in JSON as null
) for the clubLevel
key. If unsuccessful,
- Try to decode a
ClubLevel
for the clubLevel
key. If unsuccessful,
- Throw an error
So if the value for the clubLevel
key is neither nil
nor a valid ClubLevel
representation, you'll get an error thrown. You'll note that this also means you'll get an error thrown if the clubLevel
key is missing entirely (rather than being present with a value of nil
).
Ignoring missing keys is done with decodeIfPresent
:
self.clubLevel = try container.decodeIfPresent(ClubLevel.self, forKey: .clubLevel)
This will now:
- Return
nil
if the clubLevel
key is missing from the container. If they key is present,
- Try to decode
nil
(represented in JSON as null
) for the clubLevel
key. If unsuccessful,
- Try to decode a
ClubLevel
for the clubLevel
key. If unsuccessful,
- Throw an error
This is the default behaviour for decoding optionals in a compiler-generated implementation of init(from:)
. It will still throw an error in your case as the value for the clubLevel
key is not a valid ClubLevel
.
If you want to just try and decode a ClubLevel
, assigning nil
on the decoding failing for any reason (key missing, invalid value, etc.), then you want to use try?
:
self.clubLevel = try? container.decode(ClubLevel.self, forKey: .clubLevel)
try? container.decode(ClubLevel.self, forKey: .clubLevel)
andtry container.decode(ClubLevel?.self, forKey: .clubLevel)
. you can post your comment as an answer – Fondea