У меня есть протокол:
protocol Model {}
И структуры, использующие этот протокол:
struct Foo: Model {}
Тогда у меня другой протокол с общим:
protocol Controller {
func fun<T: Model>() -> Observable<T>
}
Реализация метода контроллера может выводить тип:
class Bar: Controller {
func fun<Foo>() -> Observable<Foo> {
// return an observable
}
}
Я думал, что здесь у меня было два «базовых» протокола: один для моделей и один для контроллеров. Базовый контроллер диктует метод для реализации с использованием универсального элемента группы базовых моделей, после чего реализация может указывать, какую модель использовать. После написания всего, что он компилируется нормально, и все кажется в порядке, но когда я делаю экземпляр Bar
и пытаюсь вызвать на нем fun()
, я получаю сообщение об ошибке Generic parameter 'Foo' can not be inferred
.
Вот как минимум полный пример для воспроизведения с:
protocol Model {}
struct Foo: Model {}
protocol Controller {
func fun<T: Model>() -> Observable<T>
}
class Bar: Controller {
func fun<Foo>() -> Observable<Foo> {
return Observable.create { observer in
let cancel = Disposables.create {
// clean up
}
return cancel
}
}
}
Вызов Bar().fun()
теперь выдаст ошибку: Generic parameter 'Foo' can not be inferred
Здесь есть две вещи, которые я не понимаю. Во-первых, как он может узнать, что я вызываю реализацию, в которой указан Foo, и в то же время не могу определить тип? Foo не является универсальным, это фактический тип структуры Foo. Второе, чего я не понимаю, и фактический вопрос здесь - это , если я вызываю метод в экземпляре, который реализовал и указал универсальный метод, почему он не может вывести тип ?