`CGFloat を返す関数で演算を行おうとすると、エラーが発生します。
指定された引数を受け入れる「/」のオーバーロードが見つかりませんでした
func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{
return (M_PI * (x) / 180.0) // error is here.
}
他の誰かがこの種の問題を見たことがありますか?
`CGFloat を返す関数で演算を行おうとすると、エラーが発生します。
指定された引数を受け入れる「/」のオーバーロードが見つかりませんでした
func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{
return (M_PI * (x) / 180.0) // error is here.
}
他の誰かがこの種の問題を見たことがありますか?
これはdouble
tofloat
変換の問題です。
64 ビット マシンでCGFloat
は、 は と として定義され、とはどちらも double であるdouble
ため、問題なくコンパイルできます。M_PI
x
32 ビット マシンでCGFloat
は、 は ですが、float
依然としてM_PI
double です。残念ながら、Swift には暗黙のキャストがないため、明示的にキャストする必要があります。
return (CGFloat(M_PI) * (x) / 180.0)
リテラルの型180.0
が推測されます。
スウィフト3では
M_PI
は非推奨です。CGFloat.pi
代わりに次を使用してください。
return (x * .pi / 180.0)
この特定のケースでは、お勧めするかわいいトリックがあります
let π = CGFloat(M_PI)
どこでも Unicode、そして π はOpt+で簡単に取得できますP
複雑さを抽象化するのが最善です。最初に拡張機能を作成します
extension Double {
/** Converts the specified value in degrees into radians. */
func degrees() -> CGFloat {
return CGFloat(self) * CGFloat(M_PI / 180.0)
}
}
次に、次の例のようにコードで使用します
let angle = 30.0.degrees()
let transform = CGAffineTransformRotate(self.sliderControl.transform, angle);
最初は、Double を拡張することに消極的でした。なぜなら、カスタムに合わせた言語の使用法を作成するのが好きではないからです (C++ で見られるコーディングの恐怖から)。ただし、実際の経験から、これは言語にとって自然な抽象化の方法であることが示されています。