Вопрос по поводу массива, состоящего из экземпляров структуры

Не могли бы мне подсказать кое что. В приложении, которое я пишу есть есть структура для добавления игроков, выглядит она так:

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

Так же есть класс, с 1 Pubished свойством, которое является массивом экземпляров структуры PlayersPropeties, с возможностью запомнить данные которые пользователь ввел:

class Players : ObservableObject {
@Published var playersRow = [PlayersPropeties]() {
    didSet {
        let encoder = JSONEncoder()
        if let encoded = try? encoder.encode(playersRow) {
            UserDefaults.standard.setValue(encoded, forKey: "Players")
        }
    }
}

 init() {
    if let players = UserDefaults.standard.data(forKey: "Players") {
        let decoder = JSONDecoder()
        if let decoded = try? decoder.decode([PlayersPropeties].self, from: players) {
            self.playersRow = decoded
            return
        }
    }
}

Вопрос: мне нужно в другом View выводить игроков, которых пользователь ввел, при этом, я бы хотел, что бы это выводилось рандомно, с помощью кнопки. Допустим пользователь добавил 3 игроков и мне надо, что бы с помощью кнопки на экран выводился один из добавленных пользователем игроков.

Я могу лишь вывести весь массив через ForEach, перед этим добавив во View свойство

@ObservedObject var players = Players()

Если я что то неправильно описал я заранее извиняюсь, я новичок в swift, да и в сфере программирования...


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

Автор решения: VAndrJ

Вам нужно передавать Players в следующую View и на ней отображать нужные данные. Случайного игрока можно добавить полем объекта Players (ну допустим потом его будем шарить ещё и в другие места, а не просто отображаем любого случайного).

Пример по Вашему коду:

введите сюда описание изображения

Код:

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

class Players: ObservableObject {
    @Published var playersRow = [PlayerPropety]()
    @Published var randomizedPlayer: PlayerPropety? // Случайный сохранённый игрок
    
    func randomizePlayer() {
        randomizedPlayer = playersRow.randomElement() // Выбор случайного игрока
    }
}

struct ContentView: View {
    @StateObject var players = Players()
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(
                    "Next",
                    destination: PlayerView(players: players) // Передача дальше
                )
                Button {
                    players.playersRow.append(.init(name: "Name \(Int.random(in: 0...9999))"))
                } label: {
                    Text("Add player")
                }
                ForEach(players.playersRow) {
                    Text($0.name)
                }
                Spacer()
            }
            .navigationBarTitle("Adding", displayMode: .inline)
        }
    }
}

struct PlayerView: View {
    @ObservedObject var players: Players
    
    var body: some View {
        VStack {
            Button {
                players.randomizePlayer()
            } label: {
                Text("Randomize")
            }
            Text(players.randomizedPlayer?.name ?? "No players")
            Spacer()
        }
        .navigationBarTitle("Randomizing", displayMode: .inline)
    }
}
→ Ссылка