如果你是编程新手,这是学习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’是无法转换为‘无效’” :
那么,为什么你得到的是无用的错误讯息呢?好吧,如果你在我的例子a
可变的选项,点击,你会发现,编译器已经分配了一个特殊的“错误类型”来a
:
回到您的原代码,这个错误类型会过滤语法树,通过尝试调用SKAction.sequence
和SKAction.repeatAction
,导致其中每个返回错误类型。最后,编译器回到runAction
的顶级调用。它会尝试查找将错误类型作为参数的runAction
版本。没有这样的版本,所以(显然是随机的)它选择了runAction:completion:
版本。然后它会注意到你没有通过第二个(completion
)参数来调用runAction
并给你一个错误消息,通知你你的失败。这就是编制者不应该吸毒的原因。
那么有什么解决办法?那么,我不确定你在代码中要做什么,因为在repeatAction
操作中执行repeatActionForever
操作是没有意义的。外部(repeatAction
)操作永远不会有重复的机会,因为内部(repeatActionForever
)操作永远不会停止重复。
请把它分成几部分,为了上帝的缘故... – Arbitur 2015-03-03 00:23:46