我正在尝试运行一个等待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))
有人可以帮帮我吗?我是编程新手,所以请记住这一点。感谢
答案 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
返回)。编译器需要找到这两者的超类型:SKAction
和Void
都是子类型的一些常见类型。您可以通过将语句更改为:
let a = [SKAction.waitForDuration(60),
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addBlock1),
SKAction.runBlock(actualDuration1Reduc),
SKAction.waitForDuration(blockWait1)])))]
这里的编译器生成一个稍微有用(但可能仍然难以理解的初学者)错误消息,“' SKAction'不能转换为' Void'“:
那你为什么要收到那个无用的错误信息呢?好吧,如果您选择 - 在我的示例中单击a
变量,您将发现编译器已为a
分配了一个特殊的“错误类型”:
返回原始代码,此错误类型通过尝试调用SKAction.sequence
和SKAction.repeatAction
来填充语法树,从而导致每个错误返回错误类型。最后,编译器返回到runAction
的顶级调用。它尝试查找将错误类型作为参数的runAction
版本。没有这样的版本,所以(显然是随机的)它选择了runAction:completion:
版本。然后它会注意到您没有将第二个(completion
)参数传递给此runAction
的调用,并向您显示一条错误消息,通知您失败。这就是编制者不应该吸毒的原因。
那么修复是什么?好吧,我不确定您在代码中尝试做什么,因为在repeatActionForever
操作中执行repeatAction
操作毫无意义。外部(repeatAction
)动作永远不会有机会重复,因为内部(repeatActionForever
)动作永远不会停止重复。