2016-09-07 10 views
1

associatedtypeを使用するプロトコルに準拠したクラスを作成することはできません。プレイグランドでは、その問題を示すための簡単で簡単な例を入力しました。プロデューサはItemType準拠のアイテムを生成し、コンシューマはそれらを消費します。それは、次のとおりです。その問題の解決策(存在する場合)について関連付けられたタイプを使用するSwiftのプロトコル適合に関する問題

Playground execution failed: MyPlaygroundYeYe.playground:14:7: error: type 'DummyProducer' does not conform to protocol 'Producer' 
class DummyProducer: Producer { 
    ^
MyPlaygroundYeYe.playground:3:20: note: protocol requires nested type 'T' 
    associatedtype T: ItemType 
       ^
MyPlaygroundYeYe.playground:22:7: error: type 'DummyConsumer' does not conform to protocol 'Consumer' 
class DummyConsumer: Consumer { 
    ^
MyPlaygroundYeYe.playground:9:10: note: protocol requires function 'consume(_:item:)' with type '<P> (P, item: EmptyItem) ->()' (aka '<τ_1_0> (τ_1_0, item: EmptyItem) ->()') 
    func consume<P: Producer where P.T == T>(producer: P, item: T) 
     ^
MyPlaygroundYeYe.playground:23:10: note: candidate has non-matching type '(DummyProducer, item: EmptyItem) ->()' [with T = EmptyItem] 
    func consume(producer: DummyProducer, item: EmptyItem) { 
     ^

任意の提案:

protocol ItemType { } 

protocol Producer: class { 
    associatedtype T: ItemType 
    func registerConsumer<C: Consumer where C.T == T>(consumer: C) 
} 

protocol Consumer: class { 
    associatedtype T: ItemType 
    func consume<P: Producer where P.T == T>(producer: P, item: T) 
} 

struct EmptyItem: ItemType { } 

class DummyProducer: Producer { 
    var consumer: DummyConsumer? 

    func registerConsumer(consumer: DummyConsumer) { 
     self.consumer = consumer 
    } 
} 

class DummyConsumer: Consumer { 
    func consume(producer: DummyProducer, item: EmptyItem) { 
     print("Received \(item) from producer \(producer)") 
    } 
} 

をXcodeは私に次のエラーを警告していますか?

答えて

3

あなたのクラスDummyProducerと、このようなDummyConsumerを定義する必要があります。

class DummyProducer: Producer { 
    typealias T = EmptyItem 

    func registerConsumer<C: Consumer where C.T == T>(consumer: C) { 

    } 
} 

class DummyConsumer: Consumer { 
    typealias T = EmptyItem 

    func consume<P: Producer where P.T == T>(producer: P, item: T) { 

    } 
} 

あなたは厳密にプロトコル定義でItemTypeするassociatedTypeTを指定しているのでEmptyItemがあるので、あなたのクラスでのみEmptyItemを使用することができませんでしたItemTypeプロトコルを採用できる唯一の構造ではありません。

関連する問題