web-dev-qa-db-ja.com

二項演算子「+」は2つのCGFloatオペランドに適用できませんか?

Swiftにコーディングして上記のエラーを取得...

メッセージは他の何かをマスキングしていますかOR本当に2つのCGFloatオペランドを追加できないのですか?そうでない場合、なぜ(地上で)できないのですか?

編集

私がやろうとしているコードには特別なことは何もありません。おもしろいのは、上記のエラーメッセージVERBATIMがSwiftアシスタントコンパイラーが教えてくれることです(コードに赤い波線で下線を引きます)。

Xcode 6.3の実行(Swift 1.2)

23
Sam

二項演算子「+」を使用して2つのCGFloat変数を追加することは絶対に可能です。知っておく必要があるのは、結果の変数がCGFloat変数であることです(Inference Principle型に基づく)。

let value1 : CGFloat = 12.0
let value2 : CGFloat = 13.0
let value3   = value1 + value2
println("value3 \(value3)")

//The result is value3 25.0, and the value3 is of type CGFloat.

編集:Swift v3.0規約

let value = CGFloat(12.0) + CGFloat(13.0)
println("value \(value)")

//The result is value 25.0, and the value is of type CGFloat.
24

私はこの無邪気なコードを使用してこれに遭遇しました:

_func foo(line: CTLine) {
    let ascent: CGFloat
    let descent: CGFloat
    let leading: CGFloat
    let fWidth = Float(CTLineGetTypographicBounds(line, &ascent, &descent, &leading))
    let height = ceilf(ascent + descent)
    //                 ~~~~~~ ^ ~~~~~~~
}
_

Issue Navigatorでエラーを展開することで解決策を見つけました: Expanding the error, revealing "Expected an argument list of type '(Float, Float)'"

調べてみると、Swift=は最初にその戻り型に基づいて+(lhs: Float, rhs: Float) -> Float関数を見つけました(ceilfFloatを受け取ります)。明らかに、これはFloatsではなくCGFloatsを取り、エラーメッセージの意味にいくらか光を当てます。 eithera Doubleora Float(または単にCGFloat 、明らかに)。だから私はこれを試してエラーが解決しました:

_    // ...
    let height = ceilf(Float(ascent + descent))
    // ...
_

別のアプローチは、DoubleまたはCGFloatをとる関数を使用することです。

_    // ...
    let height = ceil(ascent + descent)
    // ...
_

問題は、コンパイラーがパラメーター型よりも戻り型を優先することです。これを確認できてうれしいことは、まだSwift 3; P

4
Ben Leggiero

この種のエラーが発生する主な原因は2つあります。

最初:

次のようなオプションのタイプCGFloat変数を比較しようとするたびに

if a? >= b?
   {
     videoSize = size;
   }

これはエラーの原因であるため、jusはif a! >= b!{}

2番目:使用値を指定して、その時点で結果を得るときはいつでも、この種のエラーが発生します

お気に入り

var result = 1.5 / 1.2

上記のように使用しないでください。
CGFloatとして宣言されているオブジェクトで使用

お気に入り

var a : CGFloat = 1.5
var b : CGFloat = 1.2
var result : CGFloat!
result = a / b
1
Rakesh Patel