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
也可以只用一个协议来表示,您也可以将 Entity
、EntityConverter
和 GetEntityListServerAction
转换为结构。
以下 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
也可以只用一个协议来表示,您也可以将 Entity
、EntityConverter
和 GetEntityListServerAction
转换为结构。