Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 泛型:相同类型约束类型';G';不符合要求的协议';发电机&x27;_Swift - Fatal编程技术网

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

Swift 泛型:相同类型约束类型';G';不符合要求的协议';发电机&x27;,swift,Swift,我正在开发一个Generator类,它封装了另一个Generator,并在上面提供了一些额外的特性。除了一件事之外,我几乎所有的东西都在工作:一个方便的init,它接受一个序列作为参数,并从中自动创建一个生成器 这是导致错误的代码: class MyGenerator<G: Generator>: Generator { typealias Element = G.Element var generator: G init (_ generator: G)

我正在开发一个Generator类,它封装了另一个Generator,并在上面提供了一些额外的特性。除了一件事之外,我几乎所有的东西都在工作:一个方便的init,它接受一个序列作为参数,并从中自动创建一个生成器

这是导致错误的代码:

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()
    }
}
类MyGenerator:生成器{
typealias元素=G.元素
无功发生器:G
init(u生成器:G){
self.generator=generator
}
//错误:同一类型约束类型“G”不符合
//所需协议“生成器”
便利初始化(序列:S){
self.init(sequence.generate())
}
// [...]
func next()->元素{
返回生成器.next()
}
}
这是怎么回事?为什么斯威夫特不喜欢我的约束?我觉得还可以


我是做错了什么,还是这是一个编译器错误?

这似乎是一个编译器错误,您可以通过将泛型参数从生成器更改为元素并使用
GeneratorOf
进行额外的间接寻址来解决它:

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()
    }
}
类MyGenerator:生成器{
typealias元素=T
无功发生器:发电机
init(u生成器:G){
self.generator=GeneratorOf(发电机)
}
便利初始化(序列:S){
self.init(sequence.generate())
}
// [...]
func next()->元素{
返回生成器.next()
}
}

谢谢!事实上,我自己也得出了同样的结论,但我正等着发帖,看看是否有人知道如何避免这种情况。