Как обсуждено в Протокол не соответствует сам по себе? , протокол не соответствует сам по себе или
протокол, от которого он наследует. В вашем случае Filters
не не соответствует Encodable
.
Возможное решение - сделать struct BankAccountParamters
и
protocol Parameters
универсальный:
protocol Filters: Encodable {
var page: Int { get }
}
protocol Parameters: Encodable {
associatedtype T: Filters
var type: String { get }
var filters: T { get }
}
struct BankAccountFilters: Filters {
var page: Int
var isWithdrawal: Bool
}
struct BankAccountParamters<T: Filters>: Parameters {
let type: String = "Bank"
var filters: T
}
Теперь var filters
имеет тип T
, который соответствует Filters
и, следовательно, Encodable
.
Это компилирует и дает ожидаемый результат:
let baf = BankAccountFilters(page: 1, isWithdrawal: true)
let bap = BankAccountParamters(filters: baf)
let data = try! JSONEncoder().encode(bap)
print(String(data: data, encoding: .utf8)!)
// {"type":"Bank","filters":{"isWithdrawal":true,"page":1}}