Я использую протокол для кодирования соответствующих структур:
protocol RequestParameters: Encodable {
}
extension RequestParameters {
func dataEncoding() -> Data? {
guard let data = try? JSONEncoder().encode(self) else { return nil }
return data
}
}
Это прекрасно работает для кодирования таких структур:
struct StoreRequest: RequestParameters {
var storeCode : String
var storeNumber : String
}
Однако иногда мои запросы требуют некоторых «общих» параметров:
struct SpecialStoreRequest: RequestParameters {
var storeCode : String
var storeNumber : String
// Shared Parameters that appear in 70% of my requests
var sharedParam1 : String?
var sharedParam2 : String?
var sharedParam3 : String?
var sharedParam4 : String?
var sharedParam5 : String?
}
Я мог бы просто записать эти общие параметры в каждую из моих структур запросов, которые в них нуждаются, но Мне было интересно, можно ли сгруппировать их в другую структуру и каким-то образом изменить кодировку, чтобы вместо этого кодировать их на верхнем уровне
Я думаю о чем-то похожем на это:
struct SharedParameters {
// Shared Parameters that appear in 70% of my requests
var sharedParam1: String?
var sharedParam2: String?
var sharedParam3: String?
var sharedParam4: String?
var sharedParam5: String?
enum CodingKeys: String, CodingKey {
case sharedParam1
case sharedParam2
case sharedParam3
case sharedParam4
case sharedParam5
}
}
struct SpecialStoreRequest: RequestParameters {
var storeCode : String
var storeNumber : String
var sharedParams : SharedParameters?
}
Проблема с этой последней структурой состоит в том, что результирующая кодировка НЕ совпадает с первой, потому что мои общие параметры будут закодированы INSIDE ключом "sharedParams":
{
"storeCode" : "ABC",
"storeNumber" : "123456",
"sharedParams" : {"sharedParam1" : "A","sharedParam2" : "B", ...}
}
Но мне нужно, чтобы они были закодированы вместе с другими моими существующими параметрами (в данном случае storeCode & storeNumber).
{
"storeCode" : "ABC",
"storeNumber" : "123456",
"sharedParam1" : "A",
"sharedParam2" : "B",
...
}
EDIT:
Чтобы прояснить вопрос, предполагая, что это возможно, что нужно сделать, чтобы эта структура была закодирована ключом-значением непосредственно в ее родительском элементе?
extension SharedParameters: Encodable {
func encode(to encoder: Encoder) throws {
// What goes here? (Is it even possible?)
}
}