以下Swift代码无法编译:
class Entity {
}
class EntityConverter<T: Entity> {
}
class GetEntityServerAction<T: Entity, C: EntityConverter<T>> {
}
class GetEntityListServerAction<T: Entity, C: EntityConverter<T>>: GetEntityServerAction<T, C> {
}
错误:
Type 'C' does not inherit from 'EntityConverter<T>'
表示GetEntityListServerAction
类定义。
由于某些原因,编译器没有看到C参数被定义为继承完全相同的类型。
对于那些习惯于在Java或C#中复杂泛型层次结构的人而言,代码应该看起来相当简单,但Swift编译器确实不喜欢它。
答案 0 :(得分:1)
你可能会发现使用协议和相关类型是更像Swift的做事方式:
class Entity { }
protocol EntityConversionType {
// guessing when you say conversion, you mean from something?
typealias FromEntity: Entity
}
class EntityConverter<FromType: Entity>: EntityConversionType {
typealias FromEntity = FromType
}
class GetEntityServerAction<T: Entity, C: EntityConversionType where C.FromEntity == T> { }
class GetEntityListServerAction<T: Entity, C: EntityConversionType where C.FromEntity == T>: GetEntityServerAction<T, C> { }
let x = GetEntityListServerAction<Entity, EntityConverter<Entity>>()
可能GetEntityServerAction
也可以仅通过协议来表示,并且您也可以将Entity
,EntityConverter
和GetEntityListServerAction
转换为结构。