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

Swift binary operator '+' cannot be applied to two CGFloat operands

我正在 Swift 中编写一个函数来检测我点击的是哪个六边形。但是我 运行 进入一个特殊的错误消息,指出我不能添加两个 CGFloats。无论我做了什么,例如将 let 更改为 var,分别声明和分配,但没有用。我想肯定还有其他问题,但我找不到。代码如下:

func pointToCoordinate(position: CGPoint) -> (Int, Int) {
        var gridHeight = 2 * singleRadius / sqrt(CGFloat(3)) * 1.5
        var gridWidth = 2 * singleRadius
        var halfWidth = singleRadius

        var relativePosition = CGPoint(x: position.x - totalRadius / 2, y: position.y - totalRadius / 2)
        println((relativePosition.y / gridHeight))
        var row = -(cgfloatToInt)(relativePosition.y / gridHeight)
        var column: Int

        println((relativePosition.x + halfWidth * CGFloat(row + 1)) / (gridWidth))
        column = cgfloatToInt((relativePosition.x + halfWidth * CGFloat(row + 1)) / (gridWidth))

//        var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row)
        var innerX = relativePosition.x
        var innerY = relativePosition.y

        innerY = innerY - CGFloat(gridHeight * row)

        println((innerX, innerY))
        return (column, row)
    }

的确,还有其他地方不对,这个有效:

import QuartzCore

let a:CGFloat = 1
let b:CGFloat = 2

let c = a + b
var innerY: CGFloat = CGFloat(1.0) + CGFloat(2.0)

CGFloat实现了FloatingPointType类型

报错信息有误。问题是您正在尝试将 IntCGFloat.

相乘

替换:

innerY = innerY - CGFloat(gridHeight * row)

与:

innerY = innerY - gridHeight * CGFloat(row)

以上答案适用于您的代码的当前版本。对于与您发布的错误消息相对应的注释掉的版本:

替换:

var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row)

var innerY: CGFloat = CGFloat(relativePosition.y) + gridHeight * CGFloat(row)

加入晚了。根据vacawama的回答,大家都知道问题是数据类型不一样。
CGFloat 有时需要多次写入。我发现通过扩展更容易。所以分享一个答案。您可以创建一个如下所示的简单扩展。当然,这个扩展还可以进一步修改。

import CoreGraphics
extension Int {
    var cgf: CGFloat { return CGFloat(self) }
    var f: Float { return Float(self) }
}

extension Float {
    var cgf: CGFloat { return CGFloat(self) }
}

extension Double {
    var cgf: CGFloat { return CGFloat(self) }
}

extension CGFloat {
    var f: Float { return Float(self) }
}

现在我们可以写了

innerY = innerY - gridHeight * row.cgf

查看所有答案、转换、转换和扩展,我认为 Swift 的最佳解决方案是 Operator Overload。 Swift 3.0 的以下代码示例:

/// overloads -/+ between a cgfloat on the left and an int/double on the right
func - (left: CGFloat, right: Double) -> CGFloat {
    return left - CGFloat(right);
}

func - (left: CGFloat, right: Int) -> CGFloat {
    return left - CGFloat(right);
}

func + (left: CGFloat, right: Double) -> CGFloat {
    return left + CGFloat(right);
}

func + (left: CGFloat, right: Int) -> CGFloat {
    return left + CGFloat(right);
}

将其放入任何 class 的全局位置 OUTSIDE。看到魔法发生。