我正在开发一个包含另一个Generator的Generator类,并在它上面提供一些额外的功能。除了一件事之外,我已经完成了所有工作:一个方便的init,它将一个Sequence作为参数并自动从中创建一个生成器。
这是导致错误的代码:
class MyGenerator<G: Generator>: Generator {
typealias Element = G.Element
var generator: G
init (_ generator: G) {
self.generator = generator
}
// ERROR: Same-type constraint type 'G' does not conform to
// required protocol 'Generator'
convenience init<S: Sequence where S.GeneratorType == G>(sequence: S) {
self.init(sequence.generate())
}
// [...]
func next() -> Element? {
return generator.next()
}
}
这里发生了什么?为什么斯威夫特不喜欢我的约束?它看起来不错。
我做错了什么或这是编译器错误?
答案 0 :(得分:1)
它似乎是一个编译器错误,您可以通过将泛型参数从generator更改为element并使用GeneratorOf<T>
来获得额外的间接级别来解决它:
class MyGenerator<T>: Generator {
typealias Element = T
var generator: GeneratorOf<T>
init<G: Generator where G.Element == T>(_ generator: G) {
self.generator = GeneratorOf(generator)
}
convenience init<S: Sequence where S.GeneratorType.Element == T>(sequence: S) {
self.init(sequence.generate())
}
// [...]
func next() -> Element? {
return generator.next()
}
}