2017-06-26 1 views
0

私は音楽プレーヤーで作業しています。だから "スイッチ"をクリックすると、曲がシャッフルされます。もう一度 "Switch"をクリックした後、正常に再生されるはずです。 どうすれば曲をもう一度再生できますか? (私は配列をクリアして、同じ配列を作り直すことはできますが、それはうまくいくかもしれませんが最後の曲を維持する方法がわかりません) もう一度普通の行の曲を再生する簡単な方法はありますか?アレイをシャッフルしたあと、再び "unshuffled"にする方法

var ifshuffled=0 
@IBAction func shuffleSwitch(_ sender: Any) 
{ 
    ifshuffled += 1 
     if ifshuffled % 2 == 0 
    { 
     //playnormal 
    } 

    else 
    { 
     songs.shuffle() 
    } 
} 
+0

だからあなたの内側shuffleSwitchは、すべての曲をスタックに挿入することはできません。そのようにして再度unshuffleすると、スタックの上から最新の曲を得ることができます。また、キューを使用することもできます。 – zenwraight

+1

2つの別々のコンテナあなたがシャッフルに使うことができる普通のものと1つの曲のために。 –

+0

ここで定義する必要があるのは、「通常の」という意味です。ノーマルがソング名でアルファベット順である場合は、ソングをアンシャッフルするアルファベット順ソートを実行するだけです。 – paulvs

答えて

0

あなたのリストを列挙する:あなたは、配列をシャッフルインデックスにそれをソートし、その後、再びそれをシャッフルすることができます

let songs = [1, 3, 6, 8, 2, 4, 0] 
var enumerated = Array(songs.enumerated()) 
// [(offset: 0, element: 1), (offset: 1, element: 3), (offset: 2, element: 6), (offset: 3, element: 8), (offset: 4, element: 2), (offset: 5, element: 4), (offset: 6, element: 0)] 

enumerated.shuffle() 
// [(offset: 1, element: 3), (offset: 4, element: 2), (offset: 2, element: 6), (offset: 5, element: 4), (offset: 0, element: 1), (offset: 6, element: 0), (offset: 3, element: 8)] 

enumerated.sort { $0.offset < $1.offset } 
// [(offset: 0, element: 1), (offset: 1, element: 3), (offset: 2, element: 6), (offset: 3, element: 8), (offset: 4, element: 2), (offset: 5, element: 4), (offset: 6, element: 0)] 

この方法です。シャッフルされていないコピーを保持して、適切なインデックスで開始することもできます。

代わりに、インデックスのを作成してシャッフルしてから、それを通過してArrayの適切な場所から再生する曲を選択することもできます。そして、あなたがする必要がある場合のシーケンスまたは他の方法を増やすことで曲を再生するに切り替える:

var playOrder = Array(0..<songs.count) 
playOrder.shuffle() 
for current in playOrder { 
    playSong(index: playOrder[current]) 
} 

(もちろん、私はあなたがshuffle()方法を有することがArrayを高めてい仮定しています。)

関連する問題