Я столкнулся с этим, используя этот невинно выглядящий фрагмент кода:
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
с, а не 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