Бинарный оператор Swift «+» не может быть применен к двум операндам CGFloat

Я пишу функцию в Swift, чтобы определить, на какой шестиугольник я нажимаю. Но я столкнулся со своеобразным сообщением об ошибке, в котором говорилось, что я не могу добавить два CGFloat. Что бы я ни делал, т.е. изменение 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)
    }

Сообщение об ошибке


person Colliot    schedule 06.06.2015    source источник


Ответы (4)


Сообщение об ошибке неверно. Проблема в том, что вы пытаетесь умножить 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)
person vacawama    schedule 06.06.2015
comment
Неверное сообщение об ошибке по-прежнему очень актуально в отношении этого же сообщения в Xcode 8/Swift 3. - person Dan Rosenstark; 18.11.2016
comment
@SpaceDog Я считаю, что ошибки компилятора Swift охватывают всю гамму: они говорят вам то, что вам нужно знать, точны, но полезны только для автора компилятора и совершенно неверны. Этот случай был совершенно ошибочным. - person vacawama; 10.02.2019
comment
@vacawama - несколько минут назад я добавил CGFloat к Float, и сообщение об ошибке было бинарным оператором + не может быть применено к CGFloat, что является ерундой. Правильное сообщение должно быть таким: вы не можете добавлять CGFloats и Floats. Бинарный оператор — это сбивающий с толку термин, потому что вы думаете о бинарных операциях. Я создаю приложения с 2008 года. Я никогда не видел ни одного сообщения об ошибке Xcode, указывающего на правильную проблему. Все они созданы для причинения максимальной боли. - person Duck; 10.02.2019

Просматривая все ответы, кастинги, преобразования и расширения, я думаю, что лучшее решение для 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);
}

Поместите это в глобальное место OUTSIDE любого класса. Смотрите, как происходит волшебство.

person Michael Shang    schedule 13.01.2017

Действительно, что-то еще не так, это работает:

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

person Chris Conover    schedule 06.06.2015

Поздно присоединяюсь. Основываясь на ответе Вакавамы, вы все знаете, что проблема заключается в разных типах данных.
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
person san    schedule 22.04.2016