Быстродействующий двоичный оператор '+' не может применяться к двум операндам 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]()
Ответы
Ответ 1
Сообщение об ошибке неверно. Проблема в том, что вы пытаетесь умножить значения 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)
Ответ 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
Просматривая все ответы, отливки, конверсии и расширения, я думаю, что лучшим решением, которое еще предстоит сказать для Swift, является Перегрузка оператора. Пример кода для 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);
}
Поместите это в глобальное место OUTSIDE любого класса. См. Магию.
Ответ 4
Позднее присоединиться. Основываясь на ответе 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