potencia - El operador binario Swift ''+'' no se puede aplicar a dos operandos CGFloat
sumar dos numeros en swift (4)
Estoy escribiendo una función en Swift para detectar en qué hexágono estoy haciendo clic. Pero me encontré con un mensaje de error peculiar que indica que no puedo agregar dos CGFloats. Todo lo que hice, por ejemplo, cambiando let
a var
, declare y cesé por separado, no funcionó. Supongo que debe haber algo más mal, pero no puedo encontrarlo. El código es el siguiente:
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)
}
De hecho, hay algo más mal, esto funciona:
import QuartzCore
let a:CGFloat = 1
let b:CGFloat = 2
let c = a + b
var innerY: CGFloat = CGFloat(1.0) + CGFloat(2.0)
y CGFloat
implementa el tipo FloatingPointType
El mensaje de error es incorrecto. El problema es que estás tratando de multiplicar un Int
y un CGFloat
.
Reemplazar:
innerY = innerY - CGFloat(gridHeight * row)
con:
innerY = innerY - gridHeight * CGFloat(row)
La respuesta anterior es para la versión actual de su código. Para la versión comentada que corresponde al mensaje de error que publicó:
Reemplazar:
var innerY: CGFloat = CGFloat(relativePosition.y) + CGFloat(gridHeight * row)
con
var innerY: CGFloat = CGFloat(relativePosition.y) + gridHeight * CGFloat(row)
Mirando a través de todas las respuestas, castings, conversiones y extensiones, creo que la mejor solución para Swift es la sobrecarga del operador . Ejemplo de código a continuación para 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);
}
Ponga esto en un lugar global FUERA de cualquier clase. Ver la magia ocurre.
Tarde para unirse. Según la respuesta de Vacawama, todos saben que el problema no es tener el mismo tipo de datos.
CGFloat
necesita ser escrito varias veces a veces. Encontré esto más fácil a través de la extensión. Así que compartiendo una respuesta. Puede crear una extensión simple como a continuación. Por supuesto, esta extensión se puede modificar aún más.
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) }
}
Ahora podemos escribir
innerY = innerY - gridHeight * row.cgf