Контекст
В настоящее время декодирует данные JSON, которые содержат следующий элемент:
{
"events": [
{
...
"rrule": "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR",
...
}
]
}
Я анализирую данные JSON и собираю значение rrule
в строку. Пока все хорошо, все отлично работает.
Проблема
Однако я хотел бы преобразовать этот String
в сложный объект Swift (enum / struct). По сути, я пытаюсь разобрать эту строку в соответствии с ее форматом, определенным в RFC 5545 .
Возможно ли сделать это с помощью Codable (Encodable, Decodable)? Я понимаю, что это несколько ортогонально к разбору данных JSON ...
Предварительное решение (ошибка)
Упрощенная версия (ограниченная декодированием FREQ) всей структуры будет выглядеть так:
public struct ScheduledEventList: Codable {
public let events: [ScheduledEvent]
}
public struct ScheduledEvent: Codable {
public let title: String
public let rrule: RecurrenceSchema? = nil
public init(
title: String,
rrule: RecurrenceSchema?, <---- problem
) {
self.title = title
self.rrule = rrule
}
}
public enum RecurrenceFrequency: String, Codable {
case DAILY
case WEEKLY
case MONTHLY
case YEARLY
}
public enum RecurrenceSchema: Codable {
case FREQ(RecurrenceFrequency)
private enum CodingKeys: String, CodingKey {
case FREQ
}
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let value = try values.decodeIfPresent(String.self, forKey: .FREQ)
self = .FREQ(RecurrenceFrequency(rawValue: value!)!)
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
switch self {
case .FREQ(let freq):
try container.encode(freq.rawValue, forKey: .FREQ)
}
}
}
Проблема в том, что элемент, возвращаемый из данных JSON, является (конечно) String
, поэтому он жалуется на это:
ошибка: Playground.playground: 99: 12: ошибка: невозможно преобразовать значение
введите String для ожидаемого аргумента типа RecurrenceSchema?
rule: "FREQ = WEEKLY",
^ ~~~~~~~~~~~~
Есть предложения? Или лучше / проще построить анализатор вне декодирования - и просто иметь дело со String в логике кодирования / декодирования?
спасибо!