2017-07-03 3 views
0

オブジェクトをランダムに選択してビューコントローラに表示するようにコードを管理していますが、最初の配列から2番目の配列に格納されている選択されたものを削除して2回目に選択することはできませんが、これを自分のコードでどのようにするかわかりません。重複:別の配列をループするときに重複するオブジェクトが配列に格納されないようにする

@IBAction func drawCardsButtonPressed(_ sender: Any) { 

    cardsDrawnArray = [] 

    if cardsDrawn == 1 { 

     let randomCards = cardsArray[Int(arc4random_uniform(UInt32(cardsArray.count)))] 
     cardsDrawnArray.append(randomCards.tarotImage) 

     tarotCardFive.image = cardsDrawnArray[0] 

    } else if cardsDrawn == 3 { 

     for _ in 0...2 { 

      let randomCards = cardsArray[Int(arc4random_uniform(UInt32(cardsArray.count)))] 
      cardsDrawnArray.append(randomCards.tarotImage) 

     } 

     tarotCardFour.image = cardsDrawnArray[0] 
     tarotCardFive.image = cardsDrawnArray[1] 
     tarotCardSix.image = cardsDrawnArray[2] 

    } 

    else if cardsDrawn == 5 { 

     for _ in 0...4 { 

      let randomCards = cardsArray[Int(arc4random_uniform(UInt32(cardsArray.count)))] 
      cardsDrawnArray.append(randomCards.tarotImage) 
     } 

     tarotCardTwo.image = cardsDrawnArray[0] 
     tarotCardFour.image = cardsDrawnArray[1] 
     tarotCardFive.image = cardsDrawnArray[2] 
     tarotCardSix.image = cardsDrawnArray[3] 
     tarotCardEight.image = cardsDrawnArray[4] 

    } else if cardsDrawn == 9 { 

     for _ in 0...8 { 

      let randomCards = cardsArray[Int(arc4random_uniform(UInt32(cardsArray.count)))] 
      cardsDrawnArray.append(randomCards.tarotImage) 
     } 

     tarotCardOne.image = cardsDrawnArray[0] 
     tarotCardTwo.image = cardsDrawnArray[1] 
     tarotCardThree.image = cardsDrawnArray[2] 
     tarotCardFour.image = cardsDrawnArray[3] 
     tarotCardFive.image = cardsDrawnArray[4] 
     tarotCardSix.image = cardsDrawnArray[5] 
     tarotCardSeven.image = cardsDrawnArray[6] 
     tarotCardEight.image = cardsDrawnArray[7] 
     tarotCardNine.image = cardsDrawnArray[8] 

    } else { 
     print(" Invalid Number") 
    } 

} 

これを解決する助けがあれば大歓迎です。

+2

は多分に設定の代わりに、配列を使用すると、より良いオプションです。コレクションに固有の要素のみが含まれるようにします。 – chr0x

答えて

1

毎回ランダムなカードを得るためにコードを実行する代わりに、はるかに良い方法は、あなたのカードの配列をシャッフルしてから、シャッフルされた順序でカードを描くことです。はるかに効率的で、重複を考慮する必要もありません。

あなたの配列は、10までの数字1であれば基本的に、それは次のように起動します:

let cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

あなたが「ランダムスロット」を毎回選択、ループを実行する場合は、あなたが頻繁に(重複を取得しますあなたが見たように)。だから... ...

let cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
let shuffledCards = myShuffleFunc(cards) 

は、あなたのようなもので終わる:

tarotCardOne.image = shuffledCards[0] 
    tarotCardTwo.image = shuffledCards[1] 
    tarotCardThree.image = shuffledCards[2] 
    tarotCardFour.image = shuffledCards[3] 
    tarotCardFive.image = shuffledCards[4] 

するか、しかし、あなたはそれらを代入している:その時点で

[9, 2, 5, 6, 3, 1, 8, 10, 4, 7] 

、あなたは簡単に行うことができます。

は、いくつかの良いシャッフルコードについては、この記事を見てみましょう:How do I shuffle an array in Swift?

+0

素晴らしいこの作品はありがとうございます! –

関連する問題