Я хочу указать протокол, который управляет объектами определенного типа, которые соответствуют другому протоколу. Как это:Укажите связь между протоколами в Swift
// 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]
.
Как можно устранить эту ошибку?
UPDATE:
Это решение, кажется, работает:
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
Испытано на скор 1,2 – Shoaib
Да, это решение. Наверное, я думал о слишком сложной вещи, поэтому я пропустил эту простую идею. – ULazdins