別のプロトコルに準拠するいくつかの型オブジェクトを管理するプロトコルを指定したいと考えています。このような:
// Specify protocol
protocol ElementGenerator {
func getElements() -> [Element]
}
protocol Element {
// ...
}
// Implement
class FooElementGenerator: ElementGenerator {
func getElements() -> [FooElement] {
// Generate elements here
return [FooElement()]
}
}
class FooElement {
// ...
}
これをコンパイルしようとすると、エラーが発生します。
Type 'FooElementGenerator' does not conform to protocol 'ElementGenerator'
func getElements() -> [FooElement]
候補が一致しないタイプの を持っていることを示唆して() -> [FooElement]
いますが、代わりに を期待してい() -> [Element]
ます。
この種のエラーはどのように修正できますか?
アップデート:
このソリューションは機能しているようです:
protocol ElementGenerator {
typealias T:Element
func getElements() -> [T]
}
protocol Element {
// ...
}
class FooElementGenerator: ElementGenerator {
typealias T = FooElement
func getElements() -> [T] {
return [T()]
}
}
class FooElement: Element {
// ...
}
しかし、次のような変数を作成しようとすると:
let a: ElementGenerator = FooElementGenerator()
新しいエラーが表示されます:
Protocol 'ElementGenerator' can only be used as a generic constraint because it has Self or associated type requirements