對於星期五樂趣,我想以可互換的格式爲角度建模。我不確定我是否以最快捷的慣用方式完成了它,但我正在學習。所以我有一個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'操作數之間 –