缺少参数'完成的参数'在电话中

时间:2015-03-02 23:54:49

标签: swift compiler-errors completion

我正在尝试运行一个等待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 个答案:

答案 0 :(得分: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'不能转换为' Void'“:

SKAction is not convertible to Void

那你为什么要收到那个无用的错误信息呢?好吧,如果您选择 - 在我的示例中单击a变量,您将发现编译器已为a分配了一个特殊的“错误类型”:

error type

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

那么修复是什么?好吧,我不确定您在代码中尝试做什么,因为在repeatActionForever操作中执行repeatAction操作毫无意义。外部(repeatAction)动作永远不会有机会重复,因为内部(repeatActionForever)动作永远不会停止重复。