Подтвердить что ты не робот

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

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

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

ИЗМЕНИТЬ

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

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

4b9b3361

Ответ 1

Это абсолютно возможно, добавив две переменные 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.

EDIT: По соглашению 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.

Ответ 2

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

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

И нашел решение, расширив ошибку в Навигаторе проблем: Расширение ошибки, показывая

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

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

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

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

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