如果您是编程新手,那么现在不是尝试学习 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' is not convertible to 'Void'”:
那么为什么你会收到那个无用的错误消息呢?好吧,如果您在我的示例中选择单击a 变量,您会发现编译器已为a 分配了一个特殊的“错误类型”:
回到您的原始代码中,此错误类型通过尝试调用SKAction.sequence 和SKAction.repeatAction 渗透到语法树中,导致其中每个都返回错误类型。最后,编译器返回到对runAction 的顶级调用。它试图找到将错误类型作为参数的runAction 版本。不存在这样的版本,因此(显然是随机的)它选择了runAction:completion: 版本。然后它会注意到您没有将第二个 (completion) 参数传递给此调用到 runAction,并给您一条错误消息,通知您失败。这就是为什么编译器不应该做毒品。
那么解决方法是什么?好吧,我不确定您要在代码中做什么,因为在 repeatAction 操作中执行 repeatActionForever 操作毫无意义。外部 (repeatAction) 操作永远不会有机会重复,因为内部 (repeatActionForever) 操作永远不会停止重复。