Swift 协议:我可以限制关联类型吗?
Swift Protocols: can I restrict associated types?
我有一套协议:
protocol SpaceInterpolatorProtocol {
associatedtype Axis: SpaceAxisProtocol
associatedtype Spot: SpaceAxisSpotProtocol
associatedtype Vertex: SpaceVertexProtocol
....
}
protocol SpaceAxisProtocol: Equatable & Hashable {
associatedtype CoordUnit: FloatingPoint
...
}
protocol SpaceVertexProtocol:Hashable {
associatedtype Spot: SpaceAxisSpotProtocol
...
}
protocol SpaceAxisSpotProtocol : Hashable {
associatedtype Axis: SpaceAxisProtocol
...
}
是否可以限制
的 SpaceInterpolatorProtocol 定义
Axis == Spot.Axis
Axis.CoordUnit == Spot.Axis.CoordUnit
Vertex.Spot == Spot
而不在所有协议扩展中使用 where
?
这些不是限制,它们只是别名,因此您可以将它们表示为别名:
protocol SpaceInterpolatorProtocol {
associatedtype Vertex: SpaceVertexProtocol
typealias Spot = Vertex.Spot
typealias Axis = Spot.Axis
}
无关code review,喜欢就忽略:
这看起来不像是对协议的良好使用,而且感觉可能会导致很多问题和过度的类型擦除,但对齐类型不是问题。我可能会用具体结构替换所有这些,并寻找代码重复的地方,但这与问题无关。将关联类型简化为单一类型表明顶级结构应该是 SpaceInterpolator<CoordUnit: FloatingPoint>
.
我有一套协议:
protocol SpaceInterpolatorProtocol {
associatedtype Axis: SpaceAxisProtocol
associatedtype Spot: SpaceAxisSpotProtocol
associatedtype Vertex: SpaceVertexProtocol
....
}
protocol SpaceAxisProtocol: Equatable & Hashable {
associatedtype CoordUnit: FloatingPoint
...
}
protocol SpaceVertexProtocol:Hashable {
associatedtype Spot: SpaceAxisSpotProtocol
...
}
protocol SpaceAxisSpotProtocol : Hashable {
associatedtype Axis: SpaceAxisProtocol
...
}
是否可以限制
的 SpaceInterpolatorProtocol 定义Axis == Spot.Axis
Axis.CoordUnit == Spot.Axis.CoordUnit
Vertex.Spot == Spot
而不在所有协议扩展中使用 where
?
这些不是限制,它们只是别名,因此您可以将它们表示为别名:
protocol SpaceInterpolatorProtocol {
associatedtype Vertex: SpaceVertexProtocol
typealias Spot = Vertex.Spot
typealias Axis = Spot.Axis
}
无关code review,喜欢就忽略:
这看起来不像是对协议的良好使用,而且感觉可能会导致很多问题和过度的类型擦除,但对齐类型不是问题。我可能会用具体结构替换所有这些,并寻找代码重复的地方,但这与问题无关。将关联类型简化为单一类型表明顶级结构应该是 SpaceInterpolator<CoordUnit: FloatingPoint>
.