泛型:相同类型的约束类型' G'不符合要求的协议'发电机'

时间:2014-07-08 23:52:31

标签: swift

我正在开发一个包含另一个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()
    }
}

这里发生了什么?为什么斯威夫特不喜欢我的约束?它看起来不错。

我做错了什么或这是编译器错误?

1 个答案:

答案 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()
    }
}