Swift 泛型:相同类型约束类型';G';不符合要求的协议';发电机&x27;
我正在开发一个Generator类,它封装了另一个Generator,并在上面提供了一些额外的特性。除了一件事之外,我几乎所有的东西都在工作:一个方便的init,它接受一个序列作为参数,并从中自动创建一个生成器 这是导致错误的代码:Swift 泛型:相同类型约束类型';G';不符合要求的协议';发电机&x27;,swift,Swift,我正在开发一个Generator类,它封装了另一个Generator,并在上面提供了一些额外的特性。除了一件事之外,我几乎所有的东西都在工作:一个方便的init,它接受一个序列作为参数,并从中自动创建一个生成器 这是导致错误的代码: class MyGenerator<G: Generator>: Generator { typealias Element = G.Element var generator: G init (_ generator: G)
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()
}
}
谢谢!事实上,我自己也得出了同样的结论,但我正等着发帖,看看是否有人知道如何避免这种情况。