Swift 为什么这句话是“什么?”;过于复杂,无法在合理时间内解决?”;

Swift 为什么这句话是“什么?”;过于复杂,无法在合理时间内解决?”;,swift,sprite-kit,Swift,Sprite Kit,node.position给了我一个错误,说它太复杂了。这是因为在一个等式中计算两次帧宽度对编译器来说太多了吗?这似乎不太可能,而且对我来说也不太复杂。我是不是遗漏了什么 编辑:大家的集体努力,谢谢!这就是最终起作用的(几个不同答案的组合): 通常,它与编译器类型系统推断执行语句的正确类型有关。您通常可以通过提供流程的类型来缩短流程 请注意,简化方程式会产生以下结果: node.position = CGPoint(x: -width / 6.0 + width / 3.0 * CGFloat(

node.position给了我一个错误,说它太复杂了。这是因为在一个等式中计算两次帧宽度对编译器来说太多了吗?这似乎不太可能,而且对我来说也不太复杂。我是不是遗漏了什么

编辑:大家的集体努力,谢谢!这就是最终起作用的(几个不同答案的组合):


通常,它与编译器类型系统推断执行语句的正确类型有关。您通常可以通过提供流程的类型来缩短流程

请注意,简化方程式会产生以下结果:

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)