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

Col*_*iot 17 types cgfloat swift

我在Swift中编写一个函数来检测我点击的六边形.但是我遇到了一个特殊的错误消息,指出我不能添加两个CGFloats.无论我做了,例如改变letvar,申报并分别分配,没有工作.我想一定有别的错误,但我找不到.代码如下:

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)
    }
Run Code Online (Sandbox Code Playgroud)

错误信息

vac*_*ama 55

错误消息是错误的.问题是你试图乘以a Int和a CGFloat.

更换:

innerY = innerY - CGFloat(gridHeight * row)
Run Code Online (Sandbox Code Playgroud)

有:

innerY = innerY - gridHeight * CGFloat(row)
Run Code Online (Sandbox Code Playgroud)

上面的答案是针对当前版本的代码.对于与您发布的错误消息对应的注释掉的版本:

更换:

var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row)
Run Code Online (Sandbox Code Playgroud)

var innerY: CGFloat = CGFloat(relativePosition.y) + gridHeight * CGFloat(row)
Run Code Online (Sandbox Code Playgroud)

  • 对于Xcode 8/Swift 3中的相同消息,"错误消息错误"仍然非常相关. (2认同)

Mic*_*ang 5

浏览所有答案,转换,转换和扩展,我认为对于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);
}
Run Code Online (Sandbox Code Playgroud)

将这个成为一个全球性的地方以外的任何类的。看到魔术发生了。