Перебор элементов массива по очереди через кнопку

Есть класс, с вычисляемым свойством, которое состоит из экземпляров структуры.

struct Team: Identifiable, Codable, Hashable {
    var id = UUID()
    var name : String 
    }

  class TeamRow : ObservableObject {

  @Published var teamsArray : [Team] = [] {

didSet {
    let encoder = JSONEncoder()
    if let encoded = try? encoder.encode(teamsArray) {
        UserDefaults.standard.setValue(encoded, forKey: "Teams")
        }
    }
}

init() {
    if let teams = UserDefaults.standard.data(forKey: "Teams") {
        let decoder = JSONDecoder()
    if let decoded = try? decoder.decode([Team].self, from: teams) {
        self.teamsArray = decoded
        return
            }
        }
    }
}

Так же есть view, в котором можно добавлять элементы(команды) с помощью sheet.

struct PlayersRow: View {

@ObservedObject var teams = TeamRow()
@State private var team = ""
@State private var showTeamAddSheet = false

var body: some View {
    Form {
        ForEach(teams.teamsArray) { team in
            Text(team.name)
                .font(.system(size: 20))
                .padding(.horizontal, 110)
                .padding(.vertical, 10)
         }
     }
.navigationBarTitle("Teams")
.navigationBarItems(trailing: Button(action: {
    self.showTeamAddSheet = true
}) {
    Image(systemName: "plus")
        .foregroundColor(.black)
        .font(.system(size: 30))
})
.sheet(isPresented: $showTeamAddSheet) {
    AddPlayerView(teams: self.teams)
        }
    }
}

Это sheet view, которые вызывается в PlayersRow.

struct AddPlayerView: View {

@Environment(\.presentationMode) var presentationMode
@ObservedObject var teams : TeamRow
@State private var team = ""


var body: some View {

    NavigationView {

        Form {

            TextField("Add new team", text: $team)
        }
    .navigationBarItems(trailing: Button(action: {
        let newTeam = Team(name: self.team)
        self.teams.teamsArray.append(newTeam)
        self.presentationMode.wrappedValue.dismiss()
    }) {
        Text("Сохранить")
            .font(.custom("coolJazz", size: 20))
            .foregroundColor(.black)
    })
    .navigationBarTitle("Add Team")
        }
    }
}

Так же есть view, где мне нужно выводить элементы на экран по очередно, с помощью кнопки, нажал на кнопку, на экране 0 элемент, нажал на кнопку, 1 элемент, итд

struct GameView: View {

@ObservedObject var teams = TeamRow()
@State var index = 0

var body: some View {

VStack(spacing: 40) {
                
    //Text(teams.teamsArray[index]) this isn't worked, return an error: Initializer 'init(_:)' requires that 'Team' conform to 'StringProtocol'
    
    Button(action: {
        
    }) {
        Text("press it")
            }
        }
    }
}

struct GameView_Previews: PreviewProvider {
static var previews: some View {
    GameView().environmentObject(TeamRow())
    }
}

Ответы (1 шт):

Автор решения: Milez
Необходимо внести данные изменение в GameView.

struct GameView: View {

@ObservedObject var teams = TeamRow()
@State var index = 0

var body: some View {

    VStack(spacing: 40) {
        if teams.teamsArray.count > index {
            Text(teams.teamsArray[index].name)
        }
        Button(action: {
            index += 1
       if teams.teamsArray.count == index {
               index = 0
         }  
        }) {
            Text("press it")
            }
        }
    }
}

Так же можно action в кнопке вынести в отдельный метод

 func increaseIndexAndReset() {
    index += 1
       if teams.teamsArray.count == index {
       index = 0
      }  
  }
→ Ссылка