在Swift中编码并得到上述错误......
消息是否掩盖其他内容或者你真的不能添加两个CGFloat操作数吗?如果没有,为什么(在地球上)不是?
我正在尝试的代码没有什么特别之处;有趣的是,上面的错误消息VERBATIM是Swift助手编译器告诉我的内容(用红色波浪线强调我的代码)。
运行Xcode 6.3(Swift 1.2)
答案 0 :(得分:24)
绝对可能,使用二元运算符' +'添加两个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.
答案 1 :(得分:4)
我使用这段无辜的代码碰到了这个:
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
(或者只是显然是CGFloat
。 所以我尝试了这个并且错误已经解决了:
// ...
let height = ceilf(Float(ascent + descent))
// ...
另一种方法是使用一个带Double
或CGFloat
的函数:
// ...
let height = ceil(ascent + descent)
// ...
所以问题是编译器优先于参数类型返回类型。很高兴看到Swift 3中仍然会发生这种情况; P
答案 2 :(得分:0)
主要有两个可能的原因导致发生此类错误。
第一
每当您尝试比较可选类型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