我有这个协议,
protocol PaginableItem {
var resultType: ResultType { get set }
}
具有枚举类型的单个属性
enum ResultType: String, Codable {
case photo = "PHOTO"
case baseItem = "BASEITEM"
case new = "NEW"
}
我还有3个不同的结构和类符合PaginableItem
,类有一些PaginableItems
,
final class TimelineModel: Codable {
let stream: String
let participants: String
let header1: PaginableList
let header2: PaginableList
let items: PaginableList
}
final class PaginableList: Codable {
let data: [PaginableItem]
let pagination: Pagination
}
我正在尝试使用Swift 4 TimelineModel
缓存Codable
,但我不确定最好的方法。 Xcode抱怨PaginableItem
不符合Codable
。
必须在init(from decoder: Decoder) throws
中实施encode(to encoder: Encoder) throws
和ResultType
吗?
还必须PaginableItem
实施Codable
吗?
答案 0 :(得分:3)
PaginableItem
无法符合Codable
,因为Swift协议无法符合自己的要求。
来源:
Protocol doesn't conform to itself?
Encode/Decode Array of Types conforming to protocol with JSONEncoder
在上面的第二个链接之后,如果你想对PaginableItem
进行编码/解码,你必须在AnyPaginableItem
类/结构中键入它们并使其符合Encodable
/ { {1}}。我是这样做的:
Decodable
此示例仅对可以在protocol PaginableItem {
var resultType: ResultType { get set }
}
class AnyPaginableItem: Codable {
var resultType: ResultType
init(resultType: ResultType) {
self.resultType = resultType
}
}
enum ResultType: String, Codable {
case photo = "PHOTO"
case baseItem = "BASEITEM"
case new = "NEW"
}
struct ContainsPaginableItem: Codable {
let paginableItem: AnyPaginableItem
}
let paginableItem = AnyPaginableItem(resultType: .photo)
let itemToEncode = ContainsPaginableItem(paginableItem: paginableItem)
let jsonEncoder = JSONEncoder()
let jsonData = try jsonEncoder.encode(itemToEncode)
let jsonString = String(data: jsonData, encoding: .utf8)
中声明的属性进行编码,我认为这是您所需要的。
如果您需要对符合PaginableItem
类型的所有属性进行编码,那么您可以采用上述第二个链接中的更长解决方案。
答案 1 :(得分:0)
必须PaginableItem也实现Codable吗?
绝对!通过确保PaginableItem符合Codable,您可以保持与Codable for PaginableList的整体一致性。
我注意到你有ResultType符合Codable。然而,如果PaginableItem添加另一个没有的对象会发生什么 - 可能是危险。