2017-07-30 6 views
3

が含まれている私は、このプロトコルコード可能な構造は、プロトコルプロパティ

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

に準拠

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

コード可能なから継承されたプロトコルと構造体を持っているしかし、私はコード可能な構造にこのような構造を入れたときに、私は、エラー

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

あなたはプロトコルが唯一あなた何をしなければならないかを述べているのでそれを行うことはできません。したがって、プロトコルXCodableに準拠させると、Xに準拠するすべてのタイプもCodableに準拠している必要がありますが、必要な実装は提供されません。 Codableは、すべてのタイプが既にCodableであるときに何かを実装する必要はないので、おそらく混乱しているでしょう。 CodablemyFunctionという関数を実装するように頼んだ場合、OrderItemはその関数の実装が欠けていません。ここで

があなたの代わりに何ができるかです:

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

あなたは今itemsOrderItemに準拠してジェネリック型であると言います。

+0

これは素晴らしいです!どうもありがとうございます! – Tim

0

Codableは、エンコード可能およびデコード可能のタイプエイリアスです。

したがって、実装する場合は、次の2つの機能を実装する必要があります。

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

これは、「OrderItem」がプロトコルであるためです。彼女/彼の型はすでに 'Codable'型を含んでいるので、それらを実装する必要はありません。 – Pink

+0

それを明確にしていただきありがとうございます。ピンク – Vlad

関連する問題