'Shuffle inside a ForEach SwiftUI

If a do a very simple ForEach loop I'm able to use a shuffle parameter to shuffle the things inside.

Something linke this:

 var plays: [Play] = playData
    
    var body: some View {
NavigationView {
            ScrollView {
                ForEach(plays.shuffled()) { item in
                    NavigationLink {
                        PlayDetailView(play: item)
                    } label: {
                        PlayCard(play: item)
                            .padding(.vertical, 7)
                    }
                }
            }

But when I use an Environment object and call something different inside the loop, I don't have the option to shuffle things.

Can someone point me in the right direction to shuffle the results of the following loops?

var body: some View {
        LazyVGrid(columns: [GridItem(.adaptive(minimum: 160), spacing: 15)]) {
            ForEach(0..<modelData.stories.count, id: \.self) { item in
                if modelData.stories[item].featured == true {
                    NavigationLink {
                        StoryDetails(story: modelData.stories[item])
                    } label: {
                        GeneralCard(story: modelData.stories[item])
                    }
                    
                }
            }
        }
    }

Here is the ModelData:

struct Story: Hashable, Codable, Identifiable {
    var id: Int
    var title: String
    var description: String
    var featured: Bool
    var paid: Bool
    var featuredImage: String
    var bigImage: String
    var text: [String]
    var category: Category

}


Solution 1:[1]

You are creating a closed range and iterating over it, accesing the data by index. Thats in it self not a good practice. It would be easier if you iterate over the collection itself.

ForEach(modelData.stories.shuffled()) { story in
            if story.featured == true {
                NavigationLink {
                    StoryDetails(story: story)
                } label: {
                    GeneralCard(story: story)
                }
            }
            

You don“t need the initializer with the id here. Your Story items allready conform to Identifiable.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 burnsi