我正在使用协议来编码符合的结构:
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?
}
最后一个结构的问题是生成的编码与第一个不同,因为我的共享参数将在“ sharedParams ”键内编码:
{
"storeCode" : "ABC",
"storeNumber" : "123456",
"sharedParams" : {"sharedParam1" : "A","sharedParam2" : "B", ...}
}
但是我需要将它们与我的其他现有参数(在本例中为 storeCode 和 storeNumber)一起编码。
{
"storeCode" : "ABC",
"storeNumber" : "123456",
"sharedParam1" : "A",
"sharedParam2" : "B",
...
}
编辑: 为了使问题更清楚,假设有可能,这里应该怎么做才能使这个结构直接在其父级上由键值编码?
extension SharedParameters: Encodable {
func encode(to encoder: Encoder) throws {
// What goes here? (Is it even possible?)
}
}