Swift泛型复杂继承

时间:2015-04-03 18:43:28

标签: swift generics inheritance compiler-errors

以下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编译器确实不喜欢它。

1 个答案:

答案 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也可以仅通过协议来表示,并且您也可以将EntityEntityConverterGetEntityListServerAction转换为结构。