Swift 协议:我可以限制关联类型吗?

Posted

技术标签:

【中文标题】Swift 协议:我可以限制关联类型吗?【英文标题】:Swift Protocols: can I restrict associated types? 【发布时间】:2020-05-15 12:06:16 【问题描述】:

我有一套协议:

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

【问题讨论】:

【参考方案1】:

这些不是限制,它们只是别名,因此您可以将它们表示为别名:

protocol SpaceInterpolatorProtocol 
    associatedtype Vertex: SpaceVertexProtocol
    typealias Spot = Vertex.Spot
    typealias Axis = Spot.Axis


不相关的代码审查,如果你喜欢忽略: 这看起来不是很好地使用协议,并且感觉可能会导致很多问题和过多的类型擦除,但是对齐类型是没有问题的。我可能会用具体的结构替换所有这些,并寻找代码重复的地方,但这与问题无关。将关联类型简化为单一类型表明***结构应为SpaceInterpolator<CoordUnit: FloatingPoint>

【讨论】:

谢谢!这正是我所寻找的。并感谢您的建议!

以上是关于Swift 协议:我可以限制关联类型吗?的主要内容,如果未能解决你的问题,请参考以下文章

swift protocol(协议) associatedtype关联类型

Swift 仅将协议限制在某些类型的类中

Swift 协议扩展实现另一个具有共享关联类型的协议

Swift 协议扩展中的“关联类型”难以理解

为什么协议的关联类型在Swift中不使用泛型类型语法?

具有最终类的多态性,可在 swift 中实现关联类型协议