Двоичный оператор '+' нельзя применить к двум операндам CGFloat?

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

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

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

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

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

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.

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

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)
    //                 ~~~~~~ ^ ~~~~~~~
}

И нашел решение, расширив ошибку в Issue Navigator: Развернуть ошибку, открыв

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

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

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

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

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

Главным образом две возможные причины ответственны за такую ​​ошибку.

первый:

Всякий раз, когда вы пытаетесь сравнить необязательный тип переменной 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
Другие вопросы по тегам