Как создать класс Codable с несколькими возможными типами перечислений? - PullRequest
1 голос
/ 02 ноября 2019

Предположим, у меня есть объект, который может иметь один из нескольких типов перечислений. Как я могу сделать это в соответствии с Codable?

protocol Status : Codable {}
enum StatusA : String, Status {
    case a = "a"
    case b = "b"
}
enum StatusB : String, Status {
    case x = "x"
    case y = "y"
}
class ProdEvent : Codable {
    let status : Status // doesn't conform to codable
}
class MyCollection : Codable {
    let arr_events : [ProdEvent] // will be unhappy if you try to use generics or associatedType
}

1 Ответ

3 голосов
/ 02 ноября 2019

Вам нужно сделать тип Status универсальным, чтобы компилятор знал, что вы передадите конкретный тип, соответствующий протоколу Status, чтобы он был декодируемым и кодируемым.

class ProdEvent<T: Status> : Codable {
    let status : T
}

class MyCollection<T: Status> : Codable {
    let arr_events : [ProdEvent<T>]
}

Теперь вы можетеmake ProdEvent и MyCollection объект любого типа Status, как показано ниже,

var aEvent: ProdEvent<StatusA>!
var bEvent: ProdEvent<StatusB>!

var aCollection: MyCollection<StatusA>!
var bCollection: MyCollection<StatusB>!

Вы также можете проверить этот поток , почему вы не можете использовать протоколкак конкретный тип.

...