如何在swift

时间:2018-03-01 01:08:43

标签: ios swift sprite-kit skspritenode

我有一个创建下降skspritenode的函数。该函数生成一个skspritenode,动作移动到底部然后删除。它每秒都会被召唤。我正在尝试创建一个新函数,在给定时间找到这些skspritenode中最低的。我试图使用enumeratechildnodes(withname :),因为所有这些skspritenode都有相同的名称,然后我将它们的position.y附加到一个数组。然后我检查skspritenode position.y是否等于Ints数组的最小值。如果是,那么它将是最低的。

func searchLowest() {
    self.enumerateChildNodes(withName: "ball") {node,_ in
        let sprite = node as! SKSpriteNode

            var distanceArray = [Int]()

                let distance = Int(sprite.position.y)
                distanceArray.append(distance)

                let spritePosition = Int(sprite.position.y)

                if spritePosition == distanceArray.min {
                ...
                }
    }
}

然后我收到此错误消息:

  

二元运算符' =='不能应用于' Int'类型的操作数和   '() - > INT'?

我是SpriteKit的新手,非常感谢任何建议

2 个答案:

答案 0 :(得分:1)

对每个匹配的节点执行闭包,但是存储数组的代码在闭包内,因此distanceArray每次执行时只包含一个元素,并且每个元素在闭包期间都是最接近的元素。

此外,如果您实际上没有调用该函数,则会在语法错误中调用min。需要parens。

这可能不是找到最近球的最好方法,但这里是我认为有效的代码修改:

var distanceArray = [Int]()
var closestNode : SKSpriteNode?
scene.enumerateChildNodes(withName: "ball") {node,_ in

    if let sprite = node as? SKSpriteNode {
        let distance = Int(sprite.position.y)
        distanceArray.append(distance)
        if distance == distanceArray.min() {
            closestNode = sprite
        }
    }
}
print ("\(String.init(describing: closestNode))")

答案 1 :(得分:0)

问题是您的语法存在缺陷。你想调用Array.min()而不是Array.min,由于尾随闭包(用于if语句),编译器推断为函数Array.min(by:),因此将Int()->Int?类型的闭包进行比较时出错。您只需致电distanceArray.min()即可解决问题。

但是,您当前的代码似乎存在更大的问题。 distanceArray应该在枚举范围之外声明,否则它将始终只有一个元素,即当前节点的距离。此外,您可能想要检查距离是否小于或等于当前最小值,而不是检查它是否等于最小值。由于您已在position中存储完全相同的值,因此无需声明distance

func searchLowest() {
    var distanceArray = [Int]()
    self.enumerateChildNodes(withName: "ball") {node,_ in
        let sprite = node as! SKSpriteNode
        let distance = Int(sprite.position.y)
        distanceArray.append(distance)

        if let currentMin = distanceArray.min(), distance <= currentMin {
            ...
        }
    }
}