import Foundation class Response: Decodable where T: Decodable { let success: Bool let data: T? let error: String? let errorCode: ApiErrorCode? enum CodingKeys: String, CodingKey { case success case data case error case errorCode } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) success = try container.decode(Bool.self, forKey: .success) if success { data = try container.decode(T.self, forKey: .data) error = nil errorCode = nil } else { error = try container.decode(String.self, forKey: .error) errorCode = try container.decodeIfPresent(ApiErrorCode.self, forKey: .errorCode) data = nil } } }