Swift 使用全局函数永远重复操作

Swift 使用全局函数永远重复操作,swift,sprite-kit,repeat,skaction,Swift,Sprite Kit,Repeat,Skaction,我有一个需要不断向上移动的矩形,但它也是全局声明的,所以我可以在多个地方调用它: var obstacle = SKNode! override func didMoveToView { obstacle = rectangle() } func rectangle() -> SKNode { let rect = SKSpriteNode(imageNamed: "Rectangle@x2") rect.size = CGSizeMak

我有一个需要不断向上移动的矩形,但它也是全局声明的,所以我可以在多个地方调用它:

   var obstacle = SKNode!

  override func didMoveToView {
     obstacle = rectangle()
    }


  func rectangle() -> SKNode {
   let rect = SKSpriteNode(imageNamed: "Rectangle@x2")
    rect.size = CGSizeMake(30, 30)

    rect.position = CGPointMake(210, -250)
    rect.physicsBody?.categoryBitMask = PhysicsCatagory.littleRect
   rect.physicsBody?.contactTestBitMask = PhysicsCatagory.bigRect
    rect.physicsBody?.collisionBitMask = 0
   rect.physicsBody = SKPhysicsBody(rectangleOfSize: rect.size)
    rect.physicsBody?.dynamic = true
    rect.physicsBody?.affectedByGravity = false
    rect.runAction(
        SKAction.moveByX(0, y: 1200,
            duration: NSTimeInterval(6.5)))

    addChild(rect)
    return rect

}
When I attempt to run it as an action repeating forever like so, i get the error "cannot convert value of type SKNode to argument runBlock" : 

   runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock(rectangle),
            SKAction.waitForDuration(4.0)])))

那么,有没有一种方法可以为这样设置的函数声明这种操作呢?先谢谢你

首先,这个
var障碍=SKNode将产生错误。您应该声明一个隐式展开的可选项,如下所示:

 var obstacle:SKNode! 
override func didMoveToView(view: SKView) {

    runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock({[unowned self] in self.rectangle()}),
            SKAction.waitForDuration(4.0)])))
}
关于主要问题(不分析代码实际执行的逻辑,)…您正在将
SKNode
类的实例传递给方法(该方法接受闭包),因此会出现错误。要解决此问题,必须传递一个闭包,如下所示:

 var obstacle:SKNode! 
override func didMoveToView(view: SKView) {

    runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock({[unowned self] in self.rectangle()}),
            SKAction.waitForDuration(4.0)])))
}

@我听说如果你认为这是正确的答案,那么当你有了向上投票的能力时,请记住也向上投票。@Knight0fDragon谢谢你的编辑。但您在“显式展开可选”部分中犯了一个错误。术语是“隐式展开可选”,因为它隐式展开可选的值(不需要检查和展开)。@Whirlwind ahh,认为这是用于展开而不声明名称,good call,学到了一些新东西