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

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

    else
    {
        songs.shuffle()
    }
}

最佳答案

列举您的清单:

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()方法。)

关于arrays - 数组改组后,如何使其再次“改组”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44751934/

10-11 19:58