" CGFloat不能转换为Int"当试图计算表达式时

时间:2014-12-13 17:45:38

标签: swift

您好我的Swift代码有问题。

在我的应用程序中,某些SKLabelNode应该将其y坐标设置为

CGRectGetMaxY(self.frame) - (nodes[i].frame.size.height / 2 + 30) * (i + 4)

其中

var i:Int = 0

是一个柜台。

如果不是(i + 4)而是我给它一个字面值,它就可以正常工作5甚至是(i == 0? 4 : 5)(如果公式本身正确,只需查看两个连续的整数)。

但是当我使用任何变量或常量或包含一个的表达式时,它会显示错误" CGFloat不能转换为Int"。这似乎完全不合逻辑,因为4是一个整数,所以i甚至(i + 4)也是如此,在这种情况下,将4更改为i不应该是改变整个表达的类型。

任何人都可以解释为什么我会收到此错误,我怎么可能解决它?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您已经完全解释并解决了这个问题。这只是你接受自己出色的解释的问题:

  

如果......它只是给它一个字面值,它的效果非常好...但是当我使用任何变量或常量或含有一个的表达式时,它会显示错误“CG​​Float不能转换为Int”。

正确。数字文字可以自动强制转换为其他类型,例如CGFloat。但变量不能; 必须明确强制他们。为此,请根据旧号码初始化一个正确类型的新号码。

所以,这是自动运作的:

let f1 : CGFloat = 1.0
let f2 = f1 + 1

但在这里,你必须强迫:

let f1 : CGFloat = 1.0
let f2 = 1
let f3 = f1 + CGFloat(f2)

这是一种痛苦,但我认为这让你保持诚实。就个人而言,我同意你的沮丧,因为我在这里的讨论将表明:Swift numerics and CGFloat (CGPoint, CGRect, etc.)很难相信现代语言会被这种笨拙的数字处理所利用,特别是当我们被迫违背我们的意愿进入核心图形CGFloat在现实生活中的Cocoa编程经常使用。但看起来,这就是交易。我一直希望斯威夫特在这方面会有所改变,但到目前为止还没有发生过。并且存在一种合理的反驳,即我们在Objective-C中所做的隐式强制是危险的(事实上,64位的出现已经暴露了危险)。