2015-03-02 58 views
0

我想运行一个等待60秒的sksequence,然后启动一个无限循环,但我不断收到编译器错误“缺少参数'完成'在调用参数”这是我的代码:在调用参数'完成'缺少参数

runAction(SKAction.repeatAction((SKAction.sequence(([SKAction.waitForDuration(60), 
     runAction(SKAction.repeatActionForever(
      SKAction.sequence([ 
       SKAction.runBlock(addBlock1), 
       SKAction.runBlock(actualDuration1Reduc), 
       SKAction.waitForDuration(blockWait1),])))]))), count: 1)) 

有人可以帮我吗?我是编程新手,所以请记住这一点。谢谢

+1

请把它分成几部分,为了上帝的缘故... – Arbitur 2015-03-03 00:23:46

回答

1

如果你是编程新手,这是学习Swift的不好时机。正如你所发现的,Swift编译器经常给出的错误消息是完全没用。现在你可能会更好地学习Objective-C。

这且不说,问题的根源是,你试图从runAction使用返回值,在这里:

runAction(SKAction.repeatAction((SKAction.sequence(([SKAction.waitForDuration(60), 
    runAction(SKAction.repeatActionForever(
    ^^^^^^^^^ 
     SKAction.sequence([ 
      SKAction.runBlock(addBlock1), 
      SKAction.runBlock(actualDuration1Reduc), 
      SKAction.waitForDuration(blockWait1),])))]))), count: 1)) 

你试图在这里建立了具有两个元素的数组:一个SKAction(返回通过waitForDuration(60))和Void(由runAction返回)。编译器需要找到这两种类型的超类型:SKActionVoid都是子类型的常见类型。您可以通过改变语句来此明确地看到这一点:

let a = [SKAction.waitForDuration(60), 
    runAction(SKAction.repeatActionForever(
     SKAction.sequence([ 
      SKAction.runBlock(addBlock1), 
      SKAction.runBlock(actualDuration1Reduc), 
      SKAction.waitForDuration(blockWait1)])))] 

编译器在这里产生一个稍微有用的(但可能仍无法理解的初学者)的错误信息,“‘SKAction’是无法转换为‘无效’” :

SKAction is not convertible to Void

那么,为什么你得到的是无用的错误讯息呢?好吧,如果你在我的例子a可变的选项,点击,你会发现,编译器已经分配了一个特殊的“错误类型”来a

error type

回到您的原代码,这个错误类型会过滤语法树,通过尝试调用SKAction.sequenceSKAction.repeatAction,导致其中每个返回错误类型。最后,编译器回到runAction的顶级调用。它会尝试查找将错误类型作为参数的runAction版本。没有这样的版本,所以(显然是随机的)它选择了runAction:completion:版本。然后它会注意到你没有通过第二个(completion)参数来调用runAction并给你一个错误消息,通知你你的失败。这就是编制者不应该吸毒的原因。

那么有什么解决办法?那么,我不确定你在代码中要做什么,因为在repeatAction操作中执行repeatActionForever操作是没有意义的。外部(repeatAction)操作永远不会有重复的机会,因为内部(repeatActionForever)操作永远不会停止重复。