“在调用中缺少参数参数'队列'”

时间:2014-11-20 23:40:44

标签: ios swift ios8 sprite-kit

我正在尝试使用SKAction.repeatActionForever来运行由SKAction组成的序列以及重复之间的随机延迟。

override func didMoveToView(view: SKView) {
    let sequence = [
            SKAction.runBlock(spawnObstacle), //Missing argument for parameter 'queue' in call
            SKAction.waitForDuration(self.random(min: player.speed, max: player.speed * 2 as CGFloat))
    ]

    runAction(SKAction.repeatActionForever(SKAction.sequence(sequence)))

}
func random() -> CGFloat{
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}



func random(#min:CGFloat, max:CGFloat) -> CGFloat {
    return random() * (max - min) + min
}

spawnObstacle是一个函数,没有返回void的参数,player.speedCGFloat

我在Missing argument for parameter 'queue' in call上收到错误SKAction.runBlock(spawnObstacle)。我认为这与类型有关,而且由于某种原因,runBlock不喜欢spawnObstacle(),并试图调用

func runBlock(_ block: dispatch_block_t,queue queue: dispatch_queue_t?) -> SKAction

而不是

func runBlock(_ block: dispatch_block_t) -> SKAction

我试着打电话给SKAction.runBlock(spawnObstacle as dispatch_block_t)看看会发生什么,并且它摆脱了错误,只是为了提出另一个错误:

SKAction.waitForDuration(self.random(min: player.speed, max: player.speed * 2 as CGFloat)) //Extra argument 'min' in call

我认为这个与另一个相似(我不确定我实际上已经解决了,除了伪造编译器)。似乎编译器认为player.speed不是CGFloat所以它转到random()而不是random(#min:CGFloat, max:CGFloat)

我的问题是:据我所知,为什么这两种类型的错误发生了?

编辑:这是spawnObstacle()

func spawnObstacle() -> Void{

    let obst = Obstacle(
        color: UIColor.redColor(),
        size: CGSize(width: 50.0,height: 50.0))

    let node = SKSpriteNode(color: obst.color, size: obst.size)

    node.position = CGPoint(x: size.width, y: 0 + obst.size.height / 2)

    addChild(node)

    let duration = player.speed

    let actionMove = SKAction.moveTo(CGPoint(x:0 - obst.size.width / 2,y:node.position.y), duration: NSTimeInterval(duration))
    let actionMoveDone = SKAction.removeFromParent()

    node.runAction(SKAction.sequence([actionMove,actionMoveDone]))
}

2 个答案:

答案 0 :(得分:2)

Swift有时会发出与真正问题没有任何关系的错误。在这种情况下,您的问题是SKAction.waitForDuration需要NSTimeInterval,但您传入的是CGFloat。您需要从CGFloat构造一个NSTimeInterval。

let sequence = [
    SKAction.runBlock(spawnObstacle),
    SKAction.waitForDuration(NSTimeInterval(random(min: player.speed, max: player.speed * 2)))
]

答案 1 :(得分:-1)

runBlock期望一个块不是一个方法,你可以定义一个块并从那里调用该方法:

SKAction.runBlock({ () -> Void in self.spawnObstacle()})

或尝试

SKAction.runBlock({self.spawnObstacle()})

编辑:这不是崩溃的原因