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
类型
报错信息有误。问题是您正在尝试将 Int
和 CGFloat
.
相乘
替换:
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。看到魔法发生。
我正在 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
类型
报错信息有误。问题是您正在尝试将 Int
和 CGFloat
.
替换:
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。看到魔法发生。