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
}
在尝试子 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中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
}