行の追加と削除を同時に行うときに配列がクラッシュするのを防ぐにはどうすればよいですか?

darekm

このcircles配列を使用すると、円がランダムな位置に作成され、フェードアウトします。円がフェードアウトしたら、それを完全に削除する必要があります。これは、フェードアウトアニメーションの終了に等しい遅延の後に、配列内の対応する行を削除することによって実現されます。

「サークルを追加」ボタンをクリックする頻度が削除速度よりも少ない限り、問題なく動作します。ただし、速く押し続けると、ビューがindex out of range。でクラッシュしますこれは、アルゴリズムが混乱した結果であるように見えます。インデックスによって削除される行を識別しますが、その間に他の行が削除/追加された可能性があります。つまり、インデックスはすでに異なっています。

参照してください:

import SwiftUI

let screenW = UIScreen.main.bounds.size.width
let screenH = UIScreen.main.bounds.size.height

struct PlayGround: View {
    
    struct BlackCircle {
        var id = UUID()
        var position: CGPoint
        var opacity: Double = 1
    }
    
    @State var circles: [BlackCircle] = []
    
    
    var body: some View {
        ZStack {
            

            ForEach(Array(circles.enumerated()), id: \.1.id) {
                index, item in
                Circle()
                    .frame(width:30, height:30)
                    .position(item.position)
                    .opacity(item.opacity)
                    .onAppear {
                        
                        let animation = Animation.linear(duration: 1)
                        
                        withAnimation(animation) {
                            circles[index].opacity = 0
                        }
                        
                        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                            circles.remove(at: index)
                        }
                            
                        
                    }
                
                
            }.frame(width: screenW, height:screenH)
            
            
            Button(action: {
                
                let randx = CGFloat.random(in: 30...screenW-30)
                let randy = CGFloat.random(in: 30...screenH-30)
                let randpos = CGPoint(x: randx, y: randy)
                
                circles.append(BlackCircle(position: randpos))
                

            }, label: {
                Text("Add a Circle")
            })
            
        }
    }
}

これを解決する最も簡単で手間のかからない方法は、円がフェードアウトしたときに行を削除しないことです。ただし、これは確かにエレガントではなく非効率的です(配列に何千もの役に立たない行が含まれる可能性があります)。では、新しい要素が常に追加および遅延削除されているときに配列がクラッシュするのを防ぐにはどうすればよいですか?

ありがとう!

ニックサルノ

インデックスが範囲外であることが原因で問題が発生している場合は、インデックスではなくidに基づいて円を削除してみてください。

circles.removeAll { (existingCircle) -> Bool in
     return existingCircle.id == item.id
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

配列が空のときにUITableViewがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

エラーが発生したときにExpressjsサーバーがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

ファイルを開くときにgvimがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

ファイルを開くときにgvimがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

MSBuildがバックスラッシュをスラッシュに置き換えるのを防ぐにはどうすればよいですか?

分類Dev

条件が満たされない場合にスクリプトがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

divのサイズを同時に変更するときに、divの「ジャンプ」を防ぐにはどうすればよいですか?

分類Dev

タッチスクリーンを長時間使用するときに指の摩擦を防ぐにはどうすればよいですか?

分類Dev

子をクリックしたときに親のonClickがオフになるのを防ぐにはどうすればよいですか?

分類Dev

ボタンがクリックされたときにアプリがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

gitアクションの実行に使用されるsshキーが、その後Windowsで新しい端末が開かれたときにも、一度だけ復号化されるのを防ぐにはどうすればよいですか?

分類Dev

スクリプトの実行を長時間実行しているときにIEがフリーズするのを防ぐにはどうすればよいですか?

分類Dev

JavaScriptがブラウザをロックするのを防ぐにはどうすればよいですか?

分類Dev

画面がロックされたときにWindows8.1がフリーズするのを防ぐにはどうすればよいですか?

分類Dev

コードがインターネットを失ったときにTkinterがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

別のコンピューターでInnoSetupインストーラーを実行しているときに不明な発行元のポップアップを防ぐにはどうすればよいですか?

分類Dev

node.jsがクラッシュするのを防ぐにはどうすればよいですか?try-catchが機能しない

分類Dev

空の文字列と空のコレクションがEclipse Yassonで出力されるのを防ぐにはどうすればよいですか

分類Dev

同じドキュメントをSolrコアに再インデックス/追加するときにバージョンの競合を防ぐにはどうすればよいですか?

分類Dev

sshが〜/ .sshを作成しようとするのを防ぐにはどうすればよいですか?

分類Dev

配列内のボタンがクリックされたときの関数を実行するにはどうすればよいですか?

分類Dev

アプリケーションがクラッシュするのを防ぐにはどうすればよいですか

分類Dev

ハンドラをgoroutineに追加するときにデータの競合を防ぐにはどうすればよいですか?

分類Dev

Pythonプログラムがクラッシュするのを防ぐにはどうすればよいですか?

分類Dev

findのプルーニングと同様に、lsがディレクトリに下降するのを防ぐにはどうすればよいですか?

分類Dev

行が空/空白のときに複数行の文字列の最後の行を効率的に削除するにはどうすればよいですか?

分類Dev

1つだけで計算を実行するときに、2つの配列が等しくなるのを防ぐにはどうすればよいですか?

分類Dev

他のコード行が同時に実行されているときにサウンドを再生するにはどうすればよいですか?

分類Dev

同じ行の複数の配列に要素を追加するにはどうすればよいですか?

Related 関連記事

  1. 1

    配列が空のときにUITableViewがクラッシュするのを防ぐにはどうすればよいですか?

  2. 2

    エラーが発生したときにExpressjsサーバーがクラッシュするのを防ぐにはどうすればよいですか?

  3. 3

    ファイルを開くときにgvimがクラッシュするのを防ぐにはどうすればよいですか?

  4. 4

    ファイルを開くときにgvimがクラッシュするのを防ぐにはどうすればよいですか?

  5. 5

    MSBuildがバックスラッシュをスラッシュに置き換えるのを防ぐにはどうすればよいですか?

  6. 6

    条件が満たされない場合にスクリプトがクラッシュするのを防ぐにはどうすればよいですか?

  7. 7

    divのサイズを同時に変更するときに、divの「ジャンプ」を防ぐにはどうすればよいですか?

  8. 8

    タッチスクリーンを長時間使用するときに指の摩擦を防ぐにはどうすればよいですか?

  9. 9

    子をクリックしたときに親のonClickがオフになるのを防ぐにはどうすればよいですか?

  10. 10

    ボタンがクリックされたときにアプリがクラッシュするのを防ぐにはどうすればよいですか?

  11. 11

    gitアクションの実行に使用されるsshキーが、その後Windowsで新しい端末が開かれたときにも、一度だけ復号化されるのを防ぐにはどうすればよいですか?

  12. 12

    スクリプトの実行を長時間実行しているときにIEがフリーズするのを防ぐにはどうすればよいですか?

  13. 13

    JavaScriptがブラウザをロックするのを防ぐにはどうすればよいですか?

  14. 14

    画面がロックされたときにWindows8.1がフリーズするのを防ぐにはどうすればよいですか?

  15. 15

    コードがインターネットを失ったときにTkinterがクラッシュするのを防ぐにはどうすればよいですか?

  16. 16

    別のコンピューターでInnoSetupインストーラーを実行しているときに不明な発行元のポップアップを防ぐにはどうすればよいですか?

  17. 17

    node.jsがクラッシュするのを防ぐにはどうすればよいですか?try-catchが機能しない

  18. 18

    空の文字列と空のコレクションがEclipse Yassonで出力されるのを防ぐにはどうすればよいですか

  19. 19

    同じドキュメントをSolrコアに再インデックス/追加するときにバージョンの競合を防ぐにはどうすればよいですか?

  20. 20

    sshが〜/ .sshを作成しようとするのを防ぐにはどうすればよいですか?

  21. 21

    配列内のボタンがクリックされたときの関数を実行するにはどうすればよいですか?

  22. 22

    アプリケーションがクラッシュするのを防ぐにはどうすればよいですか

  23. 23

    ハンドラをgoroutineに追加するときにデータの競合を防ぐにはどうすればよいですか?

  24. 24

    Pythonプログラムがクラッシュするのを防ぐにはどうすればよいですか?

  25. 25

    findのプルーニングと同様に、lsがディレクトリに下降するのを防ぐにはどうすればよいですか?

  26. 26

    行が空/空白のときに複数行の文字列の最後の行を効率的に削除するにはどうすればよいですか?

  27. 27

    1つだけで計算を実行するときに、2つの配列が等しくなるのを防ぐにはどうすればよいですか?

  28. 28

    他のコード行が同時に実行されているときにサウンドを再生するにはどうすればよいですか?

  29. 29

    同じ行の複数の配列に要素を追加するにはどうすればよいですか?

ホットタグ

アーカイブ