2016-09-07 96 views
1

我无法使类符合使用associatedtype的协议。在Playground中,我输入了一个简短而简单的例子来说明这个问题:生产者生产ItemType兼容物品和消费者。它遵循:使用关联类型在Swift中使用协议一致性的问题

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警告我以下错误:

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) { 
     ^

任何建议,关于解决方案(如果存在)这个问题的?

回答

3

你应该定义你的类DummyProducerDummyConsumer这样的:

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) { 

    } 
} 

既然你严格规定associatedTypeT要在协议定义ItemType,你不能仅仅因为EmptyItemEmptyItem在使用你的类不是唯一可以采用ItemType协议的结构。

相关问题