Здесь у меня есть структура, которую я использую для результатов API
struct Response<Result> {
let status: Int
let message: String
let result: Result
}
Теперь, обычно, чтобы это соответствовало Codable
, это означало бы, что объект Result
должен быть Codable
.Это будет выглядеть следующим образом:
struct Response<Result: Codable>: Codable {...}
// or
extension Response: Codable where Result: Codable {}
Проблема, которую я получаю, состоит в том, что некоторые ответы не имеют ключа result
, и я хочу иметь возможность использовать объект Response
как с типом Void
вместо Response<Void>
очень похоже на так что вопрос .
В настоящее время у меня есть возможность обойти это, просто объявить другой тип Response
без result
переменная внутри него выглядит так:
struct BaseResponse {
let status: Int
let message: String
}
Есть ли способ обойти это, чтобы мне не нужно было объявлять другой тип Response
?
Я пыталсяделает следующее, но ничего не работает
- Я не могу соответствовать
Void
Codable
- Иметь другое расширение расширения для codable где
Result: Void
extension Response: Codable where Result: Codable {}
extension Response: Codable where Result: Void {}
Never
также не будет работать, потому что у него нет собственного инициализатора, поэтому я не могу согласовать его с
Codable
Создать тип
Nothing
, который соответствует
Codable
это
struct Nothing: Codable, Hashable {
init() {}
static var nothing: Nothing { return .init() }
}
Так что я могу использовать ответ, подобный этому
let response: Response<Nothing> = Response(
status: 200,
message: "Success",
result: .nothing
)
or
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.status = try container.decode(forKey: .status)
self.message = try container.decode(forKey: .message)
// These lines don't work.
if let result = try container.decodeIfPresent(Result.self, forKey: .result) {
self.result = result
} else {
self = .nothing
}
}
Но дело в том, что у меня не может быть decodeIfPresent
метод, специфичный для Nothing
тип.Так много для этого.