您好我的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
不应该是改变整个表达的类型。
任何人都可以解释为什么我会收到此错误,我怎么可能解决它?
提前致谢。
答案 0 :(得分:2)
您已经完全解释并解决了这个问题。这只是你接受自己出色的解释的问题:
如果......它只是给它一个字面值,它的效果非常好...但是当我使用任何变量或常量或含有一个的表达式时,它会显示错误“CGFloat不能转换为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位的出现已经暴露了危险)。