Двоичный оператор '+' не может применяться к двум операндам CGFloat?
Кодирование в Swift и получение вышеуказанной ошибки...
Является ли сообщение маскирующим что-то еще ИЛИ вы действительно не можете добавить два операнда CGFloat? Если нет, то почему (на земле) нет?
ИЗМЕНИТЬ
В коде, который я пытаюсь сделать, нет ничего особенного; Интересно, что приведенное выше сообщение об ошибке VERBATIM - это то, что говорит мне компилятор Swift-помощника (подчеркивающий мой код красными криволинейными строками).
Запуск Xcode 6.3 (Swift 1.2)
Ответы
Ответ 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