为什么这个表达太复杂而无法在合理的时间内解决?"

时间:2017-11-02 19:11:00

标签: swift sprite-kit

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)

4 个答案:

答案 0 :(得分:2)

发生这种情况的原因之一是您的类型不匹配。但是,编译器尝试找到匹配类型的方法而不是打印类型不匹配错误,而是失败。

在您的具体情况中,iInt,而表达式中的其他变量为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)