具有枚举属性的协议中的Swift 4 Codable

时间:2017-11-30 17:51:39

标签: swift enums swift4 codable

我有这个协议,

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) throwsResultType吗?

还必须PaginableItem实施Codable吗?

2 个答案:

答案 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添加另一个没有的对象会发生什么 - 可能是危险。