2017-07-30 28 views
3

我具有由可编码可编码结构包含一个协议属性

protocol OrderItem:Codable { 
    var amount:Int{get set} 
    var isPaid:Bool{get set} 
} 

继承了协议和结构符合该协议

struct ProductItem:OrderItem { 
    var amount = 0 
    var isPaid = false 
    var price = 0.0 
} 

然而,当我把这种结构成可编码结构,我得到了错误

struct Order:Codable { 
    var id:String 
    var sn:String = "" 
    var items:[OrderItem] = [] 
    var createdAt:Int64 = 0 
    var updatedAt:Int64 = 0 
} 

的错误是

Type 'Order' does not conform to protocol 'Encodable' 
Type 'Order' does not conform to protocol 'Decodable' 

但是,如果我更改项目:[OrderItem]项目:[ProductItem],一切正常!

我该如何解决这个问题?

回答

3

你不能这样做,因为协议只规定你必须做什么。因此,当您将协议X更改为Codable时,它只意味着符合X的任何类型也必须符合Codable,但它不会提供所需的实施。您可能会感到困惑,因为Codable并不要求您在所有类型已经为Codable时执行任何操作。如果Codable要求您实现一个名为myFunction的函数,则OrderItem不会缺少该函数的实现。

这里是你可以做什么,而不是:

struct Order<T: OrderItem>: Codable { 
    var id:String 
    var sn:String = "" 
    var items: [T] = [] 
    var createdAt:Int64 = 0 
    var updatedAt:Int64 = 0 
} 

现在说items是符合OrderItem泛型类型。

+0

这太棒了!非常感谢! – Tim

0

Codable是Encodable和Decodable的类型别名。

因此,如果你正在实施它,你需要实现以下两个功能。

  1. func encode(to: Encoder)
  2. init(from: Decoder)
+3

这是因为'OrderItem'是一个协议。因为她/他的类型已经包含'Codable'类型,所以他/她不需要实现这些。 – Pink

+0

谢谢澄清粉色 – Vlad