Swift 为什么这句话是“什么?”;过于复杂,无法在合理时间内解决?”;
node.position给了我一个错误,说它太复杂了。这是因为在一个等式中计算两次帧宽度对编译器来说太多了吗?这似乎不太可能,而且对我来说也不太复杂。我是不是遗漏了什么 编辑:大家的集体努力,谢谢!这就是最终起作用的(几个不同答案的组合):Swift 为什么这句话是“什么?”;过于复杂,无法在合理时间内解决?”;,swift,sprite-kit,Swift,Sprite Kit,node.position给了我一个错误,说它太复杂了。这是因为在一个等式中计算两次帧宽度对编译器来说太多了吗?这似乎不太可能,而且对我来说也不太复杂。我是不是遗漏了什么 编辑:大家的集体努力,谢谢!这就是最终起作用的(几个不同答案的组合): 通常,它与编译器类型系统推断执行语句的正确类型有关。您通常可以通过提供流程的类型来缩短流程 请注意,简化方程式会产生以下结果: node.position = CGPoint(x: -width / 6.0 + width / 3.0 * CGFloat(
通常,它与编译器类型系统推断执行语句的正确类型有关。您通常可以通过提供流程的类型来缩短流程 请注意,简化方程式会产生以下结果:
node.position = CGPoint(x: -width / 6.0 + width / 3.0 * CGFloat(i), y: height * 0.075)
您还可以明确地转换类型,这样编译器就无需执行以下操作:
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))
可以重构为如下内容:
node.position = CGPoint(x: -width * 1/6 + width / 3 * i, y: height * 0.075)
发生这种情况的原因之一是类型不匹配。但是,编译器没有打印类型不匹配错误,而是试图找到匹配类型的方法。。。失败了
在您的特定情况下,
i
是一个Int
,而表达式中的其他变量是CGFloat
:
let newXPosition: CGFloat = -width * 1/6 + width / 3 * CGFloat(i)
node.position = CGPoint(x: newXPosition, y: height * 0.075)
另外请注意,1/6
可能会被视为整数除法,结果是0
,尽管我现在不确定优先级。您可能想要:
-width * 1/6 + width / 3 * CGFloat(i)
当然。这不是一个非常明显的错误,但这是因为您试图将cgfloat与int相乘 宽度是一个CGFloat
-width / 6 + width / 3 * CGFloat(i)
for循环中的“i”是一个int
let width = self.frame.size.width
您可以像其他人提到的那样(可能更喜欢)将它们划分为子时钟,但在核心部分,您需要确保等式中的所有值都是相同类型的
使它们具有相同类型的最简单方法是将i强制转换为CGFloat
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)
}
它与类型检查有关。请看这个答案以获得一个很好的解释:我明白了。。。那么,对“简化”这个计算有什么建议吗?我只需要节点(1/3屏幕宽度长度)沿屏幕底部放置,使中间的3个最初在屏幕上居中,第一个和最后一个在屏幕外。@dulongj我刚刚更新了我的答案,它不再给我一个错误。不幸的是,这还不够,即使与nathan建议分为两行的答案相结合
I
也是一个错误Int
,因此您实际上需要使用CGFloat
强制转换。@Sulthan我同意,我在您发表评论之前已将其添加到了答案中。回答很好,我键入了与您回答完全相同的答案。这不会是CGFloat除法的1/6,否则它会抱怨您需要将1/6强制转换为CGFloat除法
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)
}
CGFloat(i)