Двоичный оператор '+' нельзя применить к двум операндам 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
с не CGFloat
s, который проливает некоторый свет на значение сообщения об ошибке. Таким образом, чтобы заставить его использовать правильный оператор, вы должны использовать функцию-обертку, которая принимает либо 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