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

时间:2015-06-06 00:14:16

标签: swift types cgfloat

我正在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)
    }

Error Message

4 个答案:

答案 0 :(得分:55)

错误消息错误。问题是您要尝试乘以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)

答案 1 :(得分:5)

查看所有答案,演员,转换和扩展,我认为对Swift来说最好的解决方案是运算符重载。 Swift 3.0下面的代码示例:

<xsl:template match="LearningStandardItem[not(@RefID[.!='']) or preceding-sibling::LearningStandardItem[@RefID = current()/@RefID]]"/>

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

答案 2 :(得分:2)

确实,还有其他错误,这有效:

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类型

答案 3 :(得分:0)

迟到加入。根据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