func createPaddles() -> SKNode {
let container = SKNode()
let colors = [SKColor.green, SKColor.blue, SKColor.red, SKColor.green, SKColor.blue]
let width = self.frame.size.width
let height = self.frame.size.height
for i in 0...4 {
let node = SKShapeNode(rectOf: CGSize(width: self.frame.size.width / 3, height: self.frame.size.height * 0.15))
node.fillColor = colors[i]
node.strokeColor = colors[i]
node.zPosition = 100
node.position = CGPoint(x: -width * 1/6 + width / 3 * i, y: height * 0.075)
container.addChild(node)
}
return container
}
node.position给我一个错误,说它太复杂了。这是因为在一个等式中计算两次帧宽对于编译器来说太多了吗?似乎不太可能,这对我来说似乎并不复杂。我在这里错过了什么吗?
编辑:大家小组的努力,谢谢!这是最终起作用的(几个不同答案的组合):node.position = CGPoint(x: -width / 6.0 + width / 3.0 * CGFloat(i), y: height * 0.075)
答案 0 :(得分:2)
发生这种情况的原因之一是您的类型不匹配。但是,编译器尝试找到匹配类型的方法而不是打印类型不匹配错误,而是失败。
在您的具体情况中,i
为Int
,而表达式中的其他变量为CGFloat
:
-width * 1/6 + width / 3 * CGFloat(i)
另请注意,1/6
可能被视为整数除法,结果为0
,但我现在不确定优先级。你可能想要:
-width / 6 + width / 3 * CGFloat(i)
可以肯定。
答案 1 :(得分:1)
通常它与编译器类型系统有关,推断执行语句的正确类型。您通常可以通过为其提供类型来简化流程。
请注意,简化等式会产生以下结果:
node.position = CGPoint(x: width * (i - 0.5) / 3.0, y: height * 0.075)
您还可以明确地转换类型,以便编译器可以做的事情更少:
node.position = CGPoint(x: CGFloat(width) * (CGFloat(i) - CGFloat(0.5)) / CGFloat(3.0), y: CGFloat(height) * CGFloat(0.075))
答案 2 :(得分:0)
当编译器需要进行大量类型检查时会发生此错误。请参阅此答案以获得一个很好的解释:https://stackoverflow.com/a/29931329/6658553
在您的特定情况下,请尝试减少您正在使用的运算符的数量,并将其拆分为多个计算。
node.position = CGPoint(x: -width * 1/6 + width / 3 * i, y: height * 0.075)
可以重构为这样的东西:
let newXPosition: CGFloat = -width * 1/6 + width / 3 * CGFloat(i)
node.position = CGPoint(x: newXPosition, y: height * 0.075)
答案 3 :(得分:0)
这不是一个非常明确的错误,但它是因为你试图将CGFloats与Ints相乘
宽度是CGFloat
let width = self.frame.size.width
" I"在你的for循环中是一个int
for i in 0...4 {
let node = SKShapeNode(rectOf: CGSize(width: self.frame.size.width / 3, height: self.frame.size.height * 0.15))
node.fillColor = colors[i]
node.strokeColor = colors[i]
node.zPosition = 100
node.position = CGPoint(x: -width * 1/6 + width / 3 * i, y: height * 0.075)
container.addChild(node)
}
您可以像其他人提到的那样(可能是首选)将它们分成子时钟,但在它的核心,您需要确保等式中的所有值都是相同的类型
使它们成为相同类型的最简单方法是将i转换为CGFloat
CGFloat(i)