我正在开发一个 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()
}
}
这是怎么回事?为什么 Swift 不喜欢我的约束?我觉得没问题。
是我做错了什么还是编译器错误?
最佳答案
这似乎是一个编译器错误,您可以通过将通用参数从生成器更改为元素并使用 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()
}
}
关于swift - 泛型 : Same-type constraint type 'G' does not conform to required protocol 'Generator' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24643335/