PATAL typealias неоднозначен для поиска типов в этом контексте - PullRequest
0 голосов
/ 26 марта 2020

Пытаясь создать подкласс моего базового класса, который соответствует 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 в подклассе?

1 Ответ

1 голос
/ 26 марта 2020

Я хочу сделать реализацию метода обязательной для любого подкласса AnyDataSource.

Путь к express, то есть AnyDataSource generi c.

class AnyDataSource<Entity: EntityProtocol>: DataSourceProtocol {
  func get() -> Entity { .init() }
}

class DataSource_A<Entity: EntityProtocol & DataSource_A_Compatible>: AnyDataSource<Entity> {
  // override if needed
}
...