'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 |
