Как я могу использовать один и тот же случайный номер дважды? - SwiftUI - PullRequest
1 голос
/ 22 февраля 2020

Я пытаюсь создать очень простое приложение для практики умножения, в котором пользователь выбирает таблицу умножения, которую он хочет практиковать, и приложение создает проблемы умножения для этой таблицы, используя случайно сгенерированное целое число от 1 до 20. Затем я хочу дать пользователь ответ.

Проблема, с которой я сталкиваюсь, заключается в том, что случайно сгенерированное число изменяется между моим кодом для отображения вопроса и моим кодом для отображения ответа. Я уверен, что есть простое решение, но я его не вижу.

Как сохранить случайно сгенерированный номер для использования в двух местах в моем коде? Или как выборочно остановить случайное рандомизирование?

Вот мой текущий код:

    struct test: View {

  @State private var multiplicationTable = 1

  var body: some View {
    VStack {
      Spacer()
      Text("Pick the multiplication table you'd like to practice!")
        .bold()
        .fontWeight(.bold)
        .font(.title)

        .multilineTextAlignment(.center)
      Stepper(value: $multiplicationTable, in: 1...12, step: 1) {
        Text("\(multiplicationTable)'s")
      }
      Text("Let's go!")
      Spacer()
      Text("Question #1: \(numberForText(multiplier1: multiplicationTable).text1)")
      Text("Answer: \(numberForText(multiplier1: multiplicationTable).text2)")
      Spacer()
    }
    .padding(.leading, 20)
    .padding(.trailing, 20)
  }

  func numberForText(multiplier1: Int) -> (text1: String, text2: String) {
    let multiplier2 = Int.random(in: 1..<21)
    return ("What is \(multiplier1) times \(multiplier2)?", "\(multiplier1) times \(multiplier2) = \(multiplier1 * multiplier2)")
  }
}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Вам нужно будет получить данные из вашего numberForText метода только один раз. И сохраните возвращенный кортеж в собственность. Вот и все!

struct test: View {

    @State private var multiplicationTable = 1

    @State private var generatedTuple: (text1: String, text2: String) = ("", "")

    var body: some View {
        VStack {
            Spacer()
            Text("Pick the multiplication table you'd like to practice!")
                .bold()
                .fontWeight(.bold)
                .font(.title)
                .multilineTextAlignment(.center)

            Stepper(value: $multiplicationTable, in: 1...12, step: 1, onEditingChanged: { (didChange) in
                self.generatedTuple = self.numberForText(multiplier1: self.multiplicationTable)
            }) {
                Text("\(multiplicationTable)'s")
            }

            Text("Let's go!")
            Spacer()

            Text("Question #1: \(self.generatedTuple.text1)")
            Text("Answer: \(self.generatedTuple.text2)")

            Spacer()
        }
        .padding(.leading, 20)
        .padding(.trailing, 20)
    }

    func numberForText(multiplier1: Int) -> (text1: String, text2: String) {
        let multiplier2 = Int.random(in: 1..<21)
        return ("What is \(multiplier1) times \(multiplier2)?", "\(multiplier1) times \(multiplier2) = \(multiplier1 * multiplier2)")
    }
}

Как видите, я использую событие закрытия Stepper onEditingChanged. Внутри этого события я вызываю ваш метод numberForText, и возвращенный кортеж сохраняется в свойстве:

@State private var generatedTuple: (text1: String, text2: String) = ("", "").

И значения Text для Вопроса и Ответа будут быть данными из сохраненного кортежа - и вы уже знаете, как их извлечь.

1 голос
/ 22 февраля 2020

Вам просто нужно сохранить сгенерированную пару вопрос-ответ. Пожалуйста, найдите ниже возможный подход:

struct test: View {

  @State private var multiplicationTable = 1

    @State private var excesize: (text1: String, text2: String) = ("", "")
  var body: some View {
    VStack {
      Spacer()
      Text("Pick the multiplication table you'd like to practice!")
        .bold()
        .fontWeight(.bold)
        .font(.title)

        .multilineTextAlignment(.center)
      Stepper(value: $multiplicationTable, in: 1...12, step: 1) {
        Text("\(multiplicationTable)'s")
      }
      Text("Let's go!")
      Spacer()
      Text("Question #1: \(excesize.text1)")
      Text("Answer: \(excesize.text2)")
      Spacer()
        Button("Next turn") { self.generateNext() }
    }
    .padding(.leading, 20)
    .padding(.trailing, 20)
  }

    func generateNext() {
        self.excesize = numberForText(multiplier1: multiplicationTable)
    }

  func numberForText(multiplier1: Int) -> (text1: String, text2: String) {
    let multiplier2 = Int.random(in: 1..<21)
    return ("What is \(multiplier1) times \(multiplier2)?", "\(multiplier1) times \(multiplier2) = \(multiplier1 * multiplier2)")
  }
}
...