Я пытаюсь выполнить вызов API, который принимает тело запроса JSON следующим образом:
[
{ "op": "replace", "path": "/info/name", "value": "TestName" },
{ "op": "replace", "path": "/info/number", "value": 100 },
{ "op": "replace", "path": "/info/location", "value": ["STATE", "CITY"] },
{ "op": "replace", "path": "/privacy/showLocation", "value": true }
]
У меня есть несколько перечислений для значений op
и path
:
enum ChangeOp: String, Encodable {
case replace
case append
}
enum ChangePath: String, Encodable {
case name = "/info/name"
case number = "/info/number"
case location = "/info/location"
case showLocation = "/privacy/showLocation"
}
В этом ответе я обнаружил, что вам нужно использовать протокол, позволяющий создавать массив общих структур, поэтому у меня есть следующее протокол и структура:
protocol UserChangeProto {
var op: ChangeOp { get }
var path: ChangePath { get }
}
struct UserChange<ValueType: Encodable>: Encodable, UserChangeProto {
let op: ChangeOp
let path: ChangePath
let value: ValueType
}
И вот где происходит кодирование:
func encodeChanges(arr: [UserChangeProto]) -> String? {
let encoder = JSONEncoder()
guard let jsonData = try? encoder.encode(arr) else {
return nil
}
return String(data: jsonData, encoding: String.Encoding.utf8)
}
func requestUserChanges(changes: String) {
print(changes)
// make API request ...
}
requestUserChanges(changes:
encodeChanges(arr: [
UserChange(op: .replace, path: .name, value: "TestName"),
UserChange(op: .replace, path: .number, value: 100),
UserChange(op: .replace, path: .location, value: ["STATE", "CITY"]),
UserChange(op: .replace, path: .showLocation, value: true)
]) ?? "null"
)
Проблема в том, что когда я пытаюсь запустить encoder.encode(arr)
, я получаю следующую ошибку: Value of protocol type 'UserChangeProto' cannot conform to 'Encodable'; only struct/enum/class types can conform to protocols
.
У меня вопрос: как мне обойти эту ошибку? Или, другими словами, как проще всего закодировать массив общих структур?
Изменить: похоже, это проблема самого языка Swift, что Команда Swift изучает. Я не знаю, как здесь действовать ...