Как использовать значение из декодированной структуры, имеющей значение типа перечисления, с пользовательскими инициализIOS

Программируем под IOS
Ответить
Anonymous
 Как использовать значение из декодированной структуры, имеющей значение типа перечисления, с пользовательскими инициализ

Сообщение Anonymous »

У меня есть ответ API, который возвращает поле JSON с противоречивыми типами. Поэтому я обратился к https://www.quicktype.io за помощью и нашел модель.
Вот часть модели, в которой у меня возникла проблема:

Код: Выделить всё

struct MyModel: Codable {
let id: ID?
}

enum ID: Codable {
case integer(Int)
case string(String)

init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if let x = try? container.decode(Int.self) {
self = .integer(x)
return
}
if let x = try? container.decode(String.self) {
self = .string(x)
return
}
throw DecodingError.typeMismatch(ID.self, DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Wrong type for ID"))
}

func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
switch self {
case .integer(let x):
try container.encode(x)
case .string(let x):
try container.encode(x)
}
}
}
У меня есть полностью декодированный ответ, и когда я пытаюсь напечатать значение, я получаю что-то вроде:

Код: Выделить всё

Optional(MyApp.ID.integer(27681250))
ИЛИ

Код: Выделить всё

Optional(MyApp.ID.string(27681250))
Я делаю это:

Код: Выделить всё

print(modelData?.id)
Я хочу получить доступ к точному значению, которое я получаю, но не могу этого сделать.
Я пробовал преобразовать его в другие типы, но это не помогает.
Любая помощь приветствуется.

Подробнее здесь: https://stackoverflow.com/questions/703 ... -with-cust
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»