プログラミングが初めての場合、これは 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
(によって返される)の 2 つの要素を持つ配列を作成しようとしています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
次に、この呼び出しに 2 番目の ( ) 引数が渡されていないことがわかりrunAction
、失敗したことを知らせるエラー メッセージが表示されます。そしてこれが、コンパイラがドラッグを行うべきではない理由です。
それで、修正は何ですか?repeatActionForever
アクション内でアクションを実行しても意味がないため、コードで何をしようとしているのかわかりませんrepeatAction
。内側の ( repeatAction
) アクションが繰り返されることは決してないため、外側の ( ) アクションが繰り返さrepeatActionForever
れることはありません。