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

Кодирование в Swift и получение вышеуказанной ошибки...

Сообщение маскирует что-то еще ИЛИ вы действительно не можете добавить два операнда CGFloat? Если нет, то почему (блин) нет?

РЕДАКТИРОВАТЬ

В коде, который я пытаюсь сделать, нет ничего особенного; интересно то, что приведенное выше сообщение об ошибке VERBATIM — это то, что мне сообщает компилятор помощника Swift (подчеркивая мой код красными волнистыми линиями).

Запуск Xcode 6.3 (Swift 1.2)


person Sam    schedule 23.02.2015    source источник
comment
Что вы можете. – (Небольшой, автономный) пример кода, демонстрирующий вашу проблему, был бы чрезвычайно полезен...   -  person Martin R    schedule 23.02.2015
comment
У меня тоже такая же ошибка, в чем может быть причина?   -  person sasquatch    schedule 02.07.2015


Ответы (3)


Это абсолютно возможно, если добавить две переменные CGFloat с помощью бинарного оператора '+'. Что вам нужно знать, так это то, что результирующая переменная также является переменной CGFloat (на основе принципа вывода типов).

let value1 : CGFloat = 12.0
let value2 : CGFloat = 13.0
let value3   = value1 + value2
println("value3 \(value3)")

//The result is value3 25.0, and the value3 is of type CGFloat.

РЕДАКТИРОВАТЬ: По соглашению Swift v3.0

let value = CGFloat(12.0) + CGFloat(13.0)
println("value \(value)")

//The result is value 25.0, and the value is of type CGFloat.
person Suresh Kumar Durairaj    schedule 23.02.2015
comment
Спасибо. Вы только что подтвердили, что я не схожу с ума. - person Sam; 23.02.2015
comment
Apple нужно либо заставить CGFloat и структуру Float Swift (и, надеюсь, также NSInteger и Int и т. д.) хорошо сочетаться друг с другом, либо придумать совершенно новую библиотеку геометрии, основанную на родных типах Swift. До тех пор переход на Swift — это настоящая PITA. - person Nicolas Miari; 16.06.2015

Я столкнулся с этим, используя этот невинно выглядящий фрагмент кода:

func foo(line: CTLine) {
    let ascent: CGFloat
    let descent: CGFloat
    let leading: CGFloat
    let fWidth = Float(CTLineGetTypographicBounds(line, &ascent, &descent, &leading))
    let height = ceilf(ascent + descent)
    //                 ~~~~~~ ^ ~~~~~~~
}

И нашел решение, развернув ошибку в Навигаторе задач: Расширение ошибки, выявление ожидаемого списка аргументов типа '(Float, Float)'

Глядя на это, я думаю, что Swift сначала нашел функцию +(lhs: Float, rhs: Float) -> Float на основе ее возвращаемого типа (ceilf принимает Float). Очевидно, что это занимает Floatс, а не CGFloatс, что проливает некоторый свет на смысл сообщения об ошибке. Итак, чтобы заставить его использовать правильный оператор, вы должны использовать функцию-оболочку, которая принимает либо Double, или Float (или просто CGFloat, очевидно). Поэтому я попробовал это, и ошибка была устранена:

    // ...
    let height = ceilf(Float(ascent + descent))
    // ...

Другой подход — использовать функцию, которая принимает Double или CGFloat:

    // ...
    let height = ceil(ascent + descent)
    // ...

Итак, проблема в том, что компилятор отдает приоритет возвращаемым типам над типами параметров. Рад видеть, что это все еще происходит в Swift 3; P

person Ky Leggiero    schedule 23.08.2016
comment
Я столкнулся с чем-то подобным. Для этого использовались старые математические методы с f в конце. Например, если вы сделаете round вместо roundf, это исчезнет. - person Sam Soffes; 23.09.2016
comment
Да, все еще происходит в Swift 3. Уровень сообщения об ошибке: Любительский. - person Nicolas Miari; 06.10.2016

В основном две возможные причины ответственны за возникновение такой ошибки.

сначала:

Всякий раз, когда вы пытаетесь сравнить переменную CGFloat необязательного типа, например

if a? >= b?
   {
     videoSize = size;
   }

Это отвечает за ошибку, поэтому просто сделайте это как if a! >= b!{}

Во-вторых: Всякий раз, когда вы используете значение для получения результата, в это время возникает такая ошибка.

нравится

var result = 1.5 / 1.2

Не используйте, как указано выше.
использовать с объектом, объявленным как CGFloat

нравится

var a : CGFloat = 1.5
var b : CGFloat = 1.2
var result : CGFloat!
result = a / b
person Rakesh Patel    schedule 06.08.2018