0

60 秒間待機してから無限ループを開始する sksequence を実行しようとしていますが、「呼び出しでパラメーター 'completion' の引数がありません」というコンパイラ エラーが引き続き発生します。これが私のコードです。

runAction(SKAction.repeatAction((SKAction.sequence(([SKAction.waitForDuration(60),
        runAction(SKAction.repeatActionForever(
            SKAction.sequence([
                SKAction.runBlock(addBlock1),
                SKAction.runBlock(actualDuration1Reduc),
                SKAction.waitForDuration(blockWait1),])))]))), count: 1))

誰か助けてくれませんか?私はプログラミングが初めてなので、覚えておいてください。ありがとう

4

1 に答える 1

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(によって返される)の 2 つの要素を持つ配列を作成しようとしていますrunActionSKActionコンパイラは、これらの両方のスーパータイプを見つける必要があります。との両方Voidがサブタイプである共通のタイプです。ステートメントを次のように変更すると、これを明示的に確認できます。

let a = [SKAction.waitForDuration(60),
    runAction(SKAction.repeatActionForever(
        SKAction.sequence([
            SKAction.runBlock(addBlock1),
            SKAction.runBlock(actualDuration1Reduc),
            SKAction.waitForDuration(blockWait1)])))]

ここでのコンパイラは、「'SKAction' は 'Void' に変換できません」というエラー メッセージを生成します。

SKAction は Void に変換できません

では、なぜ代わりにその役に立たないエラー メッセージが表示されるのでしょうか。さて、a私の例の変数をオプションクリックすると、コンパイラが特別な「エラータイプ」を に割り当てていることがわかりますa:

エラータイプ

SKAction.sequence元のコードに戻ると、このエラー タイプは、 およびを呼び出そうとする試みを通じて構文ツリーに浸透し、SKAction.repeatActionそれらのそれぞれがエラー タイプを返すようになります。最後に、コンパイラは へのトップレベルの呼び出しに戻りますrunActionrunActionエラーの種類をパラメーターとして受け取るのバージョンを見つけようとします。そのようなバージョンは存在しないため、(明らかにランダムに)runAction:completion:バージョンが選択されます。completion次に、この呼び出しに 2 番目の ( ) 引数が渡されていないことがわかりrunAction、失敗したことを知らせるエラー メッセージが表示されます。そしてこれが、コンパイラがドラッグを行うべきではない理由です。

それで、修正は何ですか?repeatActionForeverアクション内でアクションを実行しても意味がないため、コードで何をしようとしているのかわかりませんrepeatAction。内側の ( repeatAction) アクションが繰り返されることは決してないため、外側の ( ) アクションが繰り返さrepeatActionForeverれることはありません。

于 2015-03-03T00:45:23.723 に答える