Swift中的SKAction.runBlock()存在问题

Swift中的SKAction.runBlock()存在问题,swift,sprite-kit,skaction,Swift,Sprite Kit,Skaction,下面是我正在开发的一款简单的SpriteKit游戏的一些代码: let square = SKShapeNode() let square2 = SKShapeNode() override func didMoveToView(view:SKView) { var moveSquare: SKAction moveSquare = SKAction.moveTo(CGPoint(x: someNumber, y:otherNumber), duration: NSTimeIn

下面是我正在开发的一款简单的SpriteKit游戏的一些代码:

let square = SKShapeNode()
let square2 = SKShapeNode()

override func didMoveToView(view:SKView) {
    var moveSquare: SKAction
    moveSquare = SKAction.moveTo(CGPoint(x: someNumber, y:otherNumber), duration: NSTimeInterval(3))

    square.runAction(SKAction.sequence([moveSquare1, SKAction.runBlock(checkIfSquareMatches(square)),SKAction.removeFromParent()]))
    square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock(self.addChild(self.square2)) ,moveSquare, SKAction.removeFromParent()]))
}

func checkIfSquareMatches(shape:SKShapeNode) {...}
所以我有两个错误,一个在square.runAction行上,另一个在square2.runAction行上。第一个说

“无法将“()”类型的值转换为预期的参数类型‘dispatch_block_t’(也称“@convention(block)()->()”)”

第二个表示与上面相同,只是表示“type'()”,而不是“type'()”

“键入'Void'(又名'()')”

我相信这是一样的,因为“(又名“()”)”


为什么我会出现这些错误,如何修复它们?我在stackoverflow上看到了一篇稍有相似的帖子,内容是关于在SKAction.runBlock()中运行函数的问题,但解决方案指出问题在于无法在runBlock中返回值,但我的函数不返回任何值;它只改变了一些变量的值,所以我看不出有什么问题。谢谢。

当您在runBlock语句中放置代码段时,它们需要位于大括号{}内,除非它们是没有参数的简单func调用

换成

square.runAction(SKAction.sequence([moveSquare1, SKAction.runBlock( { self.checkIfSquareMatches(self.square) } ),SKAction.removeFromParent()]))
square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock( { self.addChild(self.square2 } )) ,moveSquare, SKAction.removeFromParent()]))
}

错误就会消失


注意,必须使用self引用变量。在runBlock调用中

在runBlock语句中放置代码段时,除非它们是没有参数的简单func调用,否则它们必须位于大括号{}内

换成

square.runAction(SKAction.sequence([moveSquare1, SKAction.runBlock( { self.checkIfSquareMatches(self.square) } ),SKAction.removeFromParent()]))
square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock( { self.addChild(self.square2 } )) ,moveSquare, SKAction.removeFromParent()]))
}

错误就会消失


注意,必须使用self引用变量。在runBlock调用中

谢谢!这使得程序可以工作,但是方块仍然没有添加到场景中(addchild(square2)似乎没有实际添加方块)。没有更多的错误,但是代码没有做它应该做的事情。知道为什么吗?顺便说一句,我相当确定它实际上没有被添加,因为我打开了节点计数,并且没有addChild()工作时应有的那么多节点。另外,来自第一个SKAction.runAction的SKShapeNode正方形(与square2的属性完全相同)被添加到了该动作的外部,并且它工作得非常好,因此该正方形没有任何问题。您让square2运行一个动作square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock({self.addChild(self.square2})),moveSquare,SKAction.removeFromParent()),但它尚未添加到场景中,因此无法运行操作。应该是self.runaction我像你说的那样更改了它,但它仍然没有添加到场景中。一段时间后,它也崩溃了,因为我试图添加一个已经有父节点的节点(因为上面的那些操作是另一个重复的SKAction的一部分),所以我尝试添加另一个运行块,在moveSquare操作之后从父节点移除正方形,但它仍然崩溃,原因相同。我想这已经到了一个地步,如果我可以就这一点发布一个新的问题。没关系,我想我已经找到了为什么会发生这种情况。谢谢你的帮助!非常感谢。这使得程序可以工作,但是方块仍然没有添加到场景中(addchild(square2)似乎没有实际添加方块)。没有更多的错误,但是代码没有做它应该做的事情。知道为什么吗?顺便说一句,我相当确定它实际上没有被添加,因为我打开了节点计数,并且没有addChild()工作时应有的那么多节点。另外,来自第一个SKAction.runAction的SKShapeNode正方形(与square2的属性完全相同)被添加到了该动作的外部,并且它工作得非常好,因此该正方形没有任何问题。您让square2运行一个动作square2.runAction(SKAction.sequence([SKAction.waitForDuration(1.0),SKAction.runBlock({self.addChild(self.square2})),moveSquare,SKAction.removeFromParent()),但它尚未添加到场景中,因此无法运行操作。应该是self.runaction我像你说的那样更改了它,但它仍然没有添加到场景中。一段时间后,它也崩溃了,因为我试图添加一个已经有父节点的节点(因为上面的那些操作是另一个重复的SKAction的一部分),所以我尝试添加另一个运行块,在moveSquare操作之后从父节点移除正方形,但它仍然崩溃,原因相同。我想这已经到了一个地步,如果我可以就这一点发布一个新的问题。没关系,我想我已经找到了为什么会发生这种情况。谢谢你的帮助!