Пытаясь создать подкласс моего базового класса, который соответствует PAT, я получаю следующее предупреждение компилятора:
«MyType» неоднозначен для поиска типов в этом контексте
в моем коде, как показано ниже:
protocol DataSourceProtocol {
associatedtype MyType
func get () -> MyType
}
class AnyDataSource: DataSourceProtocol {
typealias MyType = EntityProtocol
func get() -> MyType { fatalError("No implementation") }
}
class DataSource_A<T: EntityProtocol & DataSource_A_Compatible>: AnyDataSource {
typealias MyType = T
override func get() -> MyType { // <-- 'MyType' is ambiguous for type lookup in this context
return T()
}
}
class DataSource_B<T: EntityProtocol & DataSource_B_Compatible>: AnyDataSource {
override func get() -> MyType {
return T()
}
}
Я пытаюсь переопределить метод get() -> MyType
, чтобы метод экземпляра DataSource_A
возвращал специализированный тип T, следовательно typealias MyType = T
Если я изменю метод DataSource_A
на override func get -> T
, компилятор скажет, что функция не переопределяет ни один метод в своем суперклассе.
В DataSource_B
вызывается переопределенный метод, но он не предоставляет информацию о типе для типа T
, потому что вызывающий получает тип EntityProtocol
, что недостаточно.
Если я удалю объявление функции в DataSourceProtocol
и в базовом классе AnyDataSource
, и просто объявлю его в подклассе , он работает нормально, но я хочу сделать реализацию метода обязательной для любого подкласса AnyDataSource
.
Почему я не могу указать, что переопределенный метод возвращает объект типа T, изменяя значение MyType
в подклассе?