Вопрос по поводу массива, состоящего из экземпляров структуры
Не могли бы мне подсказать кое что. В приложении, которое я пишу есть есть структура для добавления игроков, выглядит она так:
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 шт):
Вам нужно передавать 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)
}
}
