【问题标题】:"Missing argument parameter 'queue' in call"“调用中缺少参数参数‘队列’”
【发布时间】:2026-02-23 11:35:02
【问题描述】:

我正在尝试使用 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.speed 是一个CGFloat

我在SKAction.runBlock(spawnObstacle) 上收到错误Missing argument for parameter 'queue' in call。我认为这与类型有关,并且由于某种原因 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]))
}

【问题讨论】:

  • spawnObstacle 是如何声明和实现的?
  • 好的,我添加了 spawnObstacle()

标签: ios swift ios8 sprite-kit


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!我收到了很多无意义的调试器错误,并且找不到调试器发现的任何问题。我从没想过实际上有错误,但与显示的不同!感谢上帝修复了这些错误的新版本(目前在旧版本的 xcode 上编码)!
最近更新 更多