PAT typealias 在这种情况下对于类型查找是不明确的

PAT typealias is ambiguous for type lookup in this context

在尝试子 class 我的符合 PAT 的基础 class 时,我得到了这个编译器警告:

'MyType' is ambiguous for type lookup in this context

在我的代码中如下所示:

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 实例方法 returns 成为专门的类型 T,因此 typealias MyType = T

如果我将 DataSource_A 方法更改为 override func get -> T,编译器会说该函数不会覆盖其 superclass.

中的任何方法

DataSource_B 中,调用了重写的方法,但没有为类型 T 提供类型信息,因为调用者收到的类型 EntityProtocol 是不够的。

如果我删除 DataSourceProtocol 和基础 class AnyDataSource 中的函数声明,并简单地在子 class 中声明它,它工作正常,但是我想让 AnyDataSource.

的任何子 class 强制执行该方法

为什么我不能通过改变子class中MyType的值来指定被覆盖的方法returns一个T类型的对象?

I want to make the method's implementation mandatory for any subclass of AnyDataSource.

表达这一点的方法是使 AnyDataSource 通用。

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

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