在对阵列进行洗牌之后,如何让它再次“未洗牌”

时间:2017-06-26 01:01:21

标签: arrays swift

我正在制作音乐播放器。因此,点击“切换”后,它会随机播放歌曲。在我再次点击“切换”后它应该正常播放。 我怎么能再次播放正常的歌曲。 (我可以尝试清除数组。再次创建相同的数组。它可能有效。但我不知道如何保持最后一首歌) 那么有没有简单的方法再次在正常的行中播放歌曲?

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

    else
    {
        songs.shuffle()
    }
}

1 个答案:

答案 0 :(得分: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个索引,随机播放,然后浏览它们并从Array中的适当位置选择要播放的歌曲。然后在需要时切换到以递增顺序或任何其他方式播放歌曲:

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

(当然,我假设您已将Array扩展为shuffle()方法。)