10

`CGFloat を返す関数で演算を行おうとすると、エラーが発生します。

指定された引数を受け入れる「/」のオーバーロードが見つかりませんでした

func kDCControlDegreesToRadians(x : CGFloat) -> CGFloat
{ 
     return (M_PI * (x) / 180.0) // error is here. 
}

他の誰かがこの種の問題を見たことがありますか?

4

4 に答える 4

17

これはdoubletofloat変換の問題です。

64 ビット マシンでCGFloatは、 は と として定義され、とはどちらも double であるdoubleため、問題なくコンパイルできます。M_PIx

32 ビット マシンでCGFloatは、 は ですが、float依然としてM_PIdouble です。残念ながら、Swift には暗黙のキャストがないため、明示的にキャストする必要があります。

return (CGFloat(M_PI) * (x) / 180.0)

リテラルの型180.0が推測されます。

スウィフト3では

M_PIは非推奨です。CGFloat.pi代わりに次を使用してください。

return (x * .pi / 180.0)
于 2014-06-09T10:24:37.243 に答える
11

この特定のケースでは、お勧めするかわいいトリックがあります

let π = CGFloat(M_PI)

どこでも Unicode、そして π はOpt+で簡単に取得できますP

于 2014-07-03T12:53:39.100 に答える
1

複雑さを抽象化するのが最善です。最初に拡張機能を作成します

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++ で見られるコーディングの恐怖から)。ただし、実際の経験から、これは言語にとって自然な抽象化の方法であることが示されています。

于 2014-12-14T11:19:37.150 に答える