Быстродействующий двоичный оператор '+' не может применяться к двум операндам 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