Swift 泛型复杂继承

Swift generics complex inheritance

以下 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 class 定义。 由于某些原因,编译器看不到 C 参数的定义就像继承它想要的完全相同的类型。

对于那些习惯了 Java 或 C# 中复杂的通用层次结构的人来说,代码应该看起来相当简单,但 Swift 编译器确实不喜欢某些东西。

您可能会发现使用协议和关联类型是更 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 也可以只用一个协议来表示,您也可以将 EntityEntityConverterGetEntityListServerAction 转换为结构。