事象
こういう構造体でAPIのレスポンスを受け取りたいが、typeがnilやキーがない時にデコード失敗してしまう
struct Hoge: Decodable {
let id: Int
let type: HogeType?
}
enum HogeType: Int, Codable {
case fuga = 1, piyo
}
対策
これをしてあげればHogeの構造体のデコードで失敗しなくなり、typeがnilやキーが存在しない時にはデコード失敗しなくなる
またはlet type: HogeType とすれば正しくデコード失敗してくれる
protocol CommonCodable: RawRepresentable<Int>, Codable {}
extension CommonCodable {
// Optionalをサポートするinit(from:)のカスタム実装
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
let rawValue = try? container.decode(RawValue.self)
if let value = Self(rawValue) {
self = value
} else {
// RawValueがデコードできなかった場合、Optionalの場合はnilを返す
if Self.self is Optional<Any>.Type {
self = Optional<Any>.none as! Self
} else {
throw DecodingError.dataCorruptedError(in: container, debugDescription: "Invalid raw value for \(Self.self)")
}
}
}
}
enum HogeType: Int, CommonCodable {
case fuga = 1, piyo
}
忘れてた
これも必要(まぁなくても書き方変えるだけで良いけども)
extension RawRepresentable {
init?(_ rawValue: RawValue?) {
guard let rawValue = rawValue else { return nil }
guard let value = Self(rawValue: rawValue) else { return nil }
self = value
}
}