Swift泛型复杂继承

安德烈(Andrey Zakharchenko)

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

空速

您可能会发现使用协议和关联类型是更类似于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以结构也。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章