二元运算符“+”不能应用于两个 CGFloat 操作数?

Binary operator '+' cannot be applied to two CGFloat operands?

在 Swift 中编码并得到上述错误...

消息是否掩盖了其他内容,或者您​​真的不能添加两个 CGFloat 操作数吗?如果不是,为什么(究竟)不是?

编辑

我尝试编写的代码没有什么特别之处;有趣的是,上面的错误消息 VERBATIM 是 Swift 助理编译器告诉我的(用红色波浪线在我的代码下划线)。

运行 Xcode 6.3 (Swift 1.2)

绝对有可能,使用二元运算符“+”添加两个 CGFloat 变量。你需要知道的是结果变量也是一个CGFloat变量(基于类型推理原理)。

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.

我 运行 使用这段看起来无辜的代码:

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)
    //                 ~~~~~~ ^ ~~~~~~~
}

并通过展开问题导航器中的错误找到了解决方案:

仔细研究,我认为 Swift 首先根据其 return 类型找到了 +(lhs: Float, rhs: Float) -> Float 函数(ceilf 接受 Float)。显然,这需要 Float 秒,而不是 CGFloat 秒,这在一定程度上阐明了错误消息的含义。因此,要强制它使用正确的运算符,您必须使用包装函数,该函数采用 a Double a Float(或者只是一个 CGFloat,很明显)。 所以我试了一下,错误解决了:

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

另一种方法是使用接受 DoubleCGFloat:

的函数
    // ...
    let height = ceil(ascent + descent)
    // ...

所以问题是 编译器优先考虑 return 类型而不是参数类型。 很高兴看到这种情况仍在 Swift 3 中发生;P

造成这种错误的原因主要有两种。

第一:

每当您尝试比较可选类型 CGFloat 变量时 喜欢

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

这是造成错误的原因,所以只需将其设为 if a! >= b!{}

第二个: 每当您当时直接使用值来获得结果时,就会发生这种错误

喜欢

var result = 1.5 / 1.2

不要像上面那样使用。
与声明为 CGFloat

的对象一起使用

喜欢

var a : CGFloat = 1.5
var b : CGFloat = 1.2
var result : CGFloat!
result = a / b