Cocoa 二进制运算符'+';不能应用于两个CGFloat操作数?
在Swift中编码并获取上述错误 消息是否屏蔽了其他内容,或者您真的不能添加两个CGFloat操作数?如果没有,为什么(地球上)没有 编辑 我试图做的代码没有什么特别之处;有趣的是,上面的错误消息,逐字逐句,是Swift助手编译器告诉我的(在我的代码下面用红色的曲线划线)Cocoa 二进制运算符'+';不能应用于两个CGFloat操作数?,cocoa,swift,cgfloat,Cocoa,Swift,Cgfloat,在Swift中编码并获取上述错误 消息是否屏蔽了其他内容,或者您真的不能添加两个CGFloat操作数?如果没有,为什么(地球上)没有 编辑 我试图做的代码没有什么特别之处;有趣的是,上面的错误消息,逐字逐句,是Swift助手编译器告诉我的(在我的代码下面用红色的曲线划线) 运行Xcode 6.3(Swift 1.2)完全可以使用二进制运算符“+”添加两个CGFloat变量。您需要知道的是,结果变量也是一个CGFloat变量(基于类型推断原则) 编辑: 根据Swift v3.0约定 let val
运行Xcode 6.3(Swift 1.2)完全可以使用二进制运算符“+”添加两个CGFloat变量。您需要知道的是,结果变量也是一个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(行:CTLine){
让我们上浮吧
让下降:CGFloat
让引导:CGFloat
设fWidth=Float(CtlineGettyPrographicBounds(直线、上升、下降和领先))
让高=天花板(上升+下降)
// ~~~~~~ ^ ~~~~~~~
}
并通过展开问题导航器中的错误找到解决方案:
查看它,我认为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
发生这种错误的原因主要有两种
第一名: // ...
let height = ceilf(Float(ascent + descent))
// ...
每当您尝试比较可选类型CGFloat变量时
像
这是导致错误的原因,因此如果是!>=B{}
秒:
每当您在那个时候直接使用value来获得结果时,就会发生这种错误
像
不要像上面那样使用。
与声明为CGFloat的对象一起使用 像
当然可以一个(小的,自包含的)代码示例演示您的问题将非常有帮助…我也得到了相同的错误,可能的原因是什么?谢谢。你刚刚证实了我没有发疯。苹果需要让
CGFloat
和斯威夫特的Float
结构(还有希望的是NSInteger
和Int
等)相互配合,或者基于斯威夫特的原生类型设计一个全新的几何库。在那之前,搬到斯威夫特是一个真正的难题。我遇到了类似的事情。使用带有尾随的f
的旧数学方法可以做到这一点。例如,如果你做round
而不是roundf
,这种情况就会消失。是的,在Swift 3中仍然会发生。错误消息级别:业余。
if a? >= b?
{
videoSize = size;
}
var result = 1.5 / 1.2
var a : CGFloat = 1.5
var b : CGFloat = 1.2
var result : CGFloat!
result = a / b