Je travaille sur une classe Generator qui encapsuleun autre générateur et fournit quelques fonctionnalités supplémentaires par-dessus. Tout fonctionne sauf une chose: une commodité qui prend une séquence en paramètre et crée automatiquement un générateur à partir de celle-ci.
C'est le code qui cause l'erreur:
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()
}
}
Qu'est-ce qui se passe ici? Pourquoi Swift n'aime pas ma contrainte? Cela me semble bien.
Est-ce que je fais quelque chose de mal ou s'agit-il d'un bogue du compilateur?
Réponses:
1 pour la réponse № 1Cela semble être un bogue du compilateur, vous pouvez le contourner en changeant l’argument générique de générateur en élément et en utilisant GeneratorOf<T>
pour un niveau supplémentaire d'indirection:
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()
}
}