/ / Generics: Le type de contrainte de type 'G' identique n'est pas conforme au protocole requis 'Generator' - swift

Génériques: le type de contrainte de type "G" n'est pas conforme au protocole "Générateur" requis - swift

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 № 1

Cela 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()
}
}