对于星期五乐趣,我想以可互换的格式为角度建模。我不确定我是否以最快捷的惯用方式完成了它,但我正在学习。所以我有一个Angle
协议,然后是3种不同的结构类型(Radians,Degrees和Rotations),它们都符合Angle协议。我想能够加/减他们,但诀窍是,我想要lhs
参数来指定返回类型。例如:Swift二元运算符用于返回接收器类型(符合协议)的协议
Degrees(180) + Rotations(0.25) --> Degrees(270)
或
Rotations(0.25) + Radians(M_PI) -> Rotations(0.75)
我希望是我可以做类似
func + (lhs:Angle, rhs:Angle) -> Angle {
return lhs.dynamicType(rawRadians: lhs.rawRadians + rhs.rawRadians)
}
的Angle
协议需要一个var rawRadians:CGFloat { get }
以及一个init(rawRadians:CGFloat)
我可以用Smalltalk-es做到这一点que双重调度方法,但我认为最适合使用更多Swift的方法(特别是需要更少代码的代码,双重调度需要大量样板代码)。
太棒了!这样可行。如果你有机会,如果你在编译器如何解释那里的语法的通用部分中加入了一些解释,我将不胜感激。我隐约有种类的理解,但还不够。 本质上是任何类型的占位符,您可以通过':Angle'部分限制可接受的地图吗? –
我说得太早。我刚刚发现了这个问题。如果我有两个声明类型为'Angle'的变量,并未进一步细化到我的三个符合结构之一,那么编译器会说'Binary operator'+'不能应用于两个'Angle'操作数之间 –