假设我有一个对象,它可以有几种枚举中的一种。如何使其符合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
}
您需要使Status
类型成为泛型,以便编译器知道您将传递一个符合协议Status
的具体类型,以便它是可解码的&可编码。
class ProdEvent<T: Status> : Codable {
let status : T
}
class MyCollection<T: Status> : Codable {
let arr_events : [ProdEvent<T>]
}
现在,您可以将ProdEvent
和MyCollection
对象设置为任何类型的Status
,如下所示,
var aEvent: ProdEvent<StatusA>!
var bEvent: ProdEvent<StatusB>!
var aCollection: MyCollection<StatusA>!
var bCollection: MyCollection<StatusB>!
您也可以检查这个线程,了解为什么不能将协议用作具体类型。