Swift возвращает случайный элемент из массива в текст - PullRequest
0 голосов
/ 12 января 2020

Эта проблема, которая, как я знаю, должна быть очень простой, озадачила меня на несколько часов.

Я пытаюсь получить случайный элемент из простого Array в Text в SwiftUI, но получаю ошибки Я не понимаю, недавняя ошибка, которую я получил:

Метод экземпляра 'appendInterpolation' требует, чтобы [Result] соответствовал _FormatSpecifiable *

Что бы быть самым простым способом реализовать это? Я понимаю, что на это уже много раз отвечали, но я слишком плохо разбираюсь в коде, чтобы понять, когда я пытаюсь его погуглить.

struct Result: Identifiable {
    var id = UUID()
    var score: Int
}

struct ContentView: View {

    @State private var showDetails = false

    @State var results = [Result(score: 8),
                          Result(score: 5),
                          Result(score: 10)]


    var body: some View {
        VStack {
            Button(action: {   
                self.results.randomElement()
            }) {
                Text("Button title, \(results)")
            }

        }
    }
}

1 Ответ

1 голос
/ 12 января 2020

Поскольку results не меняется, нет необходимости в @State (в сочетании с инициализатором на Result, поэтому мы можем легко отобразить список результатов). Вместо этого мы хотим ввести новую переменную для хранения случайного Result и пометить , что как состояние. Поэтому каждый раз, когда мы нажимаем кнопку, мы устанавливаем новый случайный результат и запускаем обновление представления.

Обратите внимание, что я пометил var как необязательный (так как я не знаю логики c за любой начальной значение) и отображение 0, если эта вещь nil (вероятно, не то, что вы хотите в вашем конечном коде - вы можете выбрать любое значение по умолчанию или отображение условного представления, которое имеет смысл для вас)

struct Result: Identifiable {
    var id = UUID()
    var score: Int
    init(_ score: Int) {
        self.score = score
    }
}

struct ContentView: View {

    @State private var showDetails = false

    let results = [8, 5, 10].map(Result.init)

    @State var randomResult: Result?

    var body: some View {
        VStack {
            Button(action: {   
                self.randomResult = self.results.randomElement()
            }) {
                Text("Button title, \(randomResult?.score ?? 0)")
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...