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

时间:2015-02-23 09:22:21

标签: cocoa swift cgfloat

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

消息是否掩盖其他内容或者你真的不能添加两个CGFloat操作数吗?如果没有,为什么(在地球上)不是?

修改

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

运行Xcode 6.3(Swift 1.2)

3 个答案:

答案 0 :(得分:24)

绝对可能,使用二元运算符' +'添加两个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.

答案 1 :(得分:4)

我使用这段无辜的代码碰到了这个:

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

通过扩展问题导航器中的错误找到解决方案: Expanding the error, revealing "Expected an argument list of type '(Float, Float)'"

调查一下,我认为Swift首先根据其返回类型找到+(lhs: Float, rhs: Float) -> Float函数(ceilf接受Float)。显然,这需要Float s,而不是CGFloat s,它会对错误消息的含义有所了解。因此,要强制它使用正确的运算符,您必须使用一个包装函数,该函数 一个Double 一个Float(或者只是显然是CGFloat所以我尝试了这个并且错误已经解决了:

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

另一种方法是使用一个带DoubleCGFloat的函数:

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

所以问题是编译器优先于参数类型返回类型。很高兴看到Swift 3中仍然会发生这种情况; P

答案 2 :(得分:0)

主要有两个可能的原因导致发生此类错误。

第一

每当您尝试比较可选类型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