Положить массив в метку в Swift

@IBAction func generateBtn(sender: UIButton) {
    let strt = UInt32(strtNum.text!)
    let end = UInt32(endNum.text!)
    let ttlNums = Int(amtNums.text!)

    let x = RandomNum()


    var z = 0

    while z<ttlNums{
        let y = x.rndNumGen(strt!, end: end!)
        z += 1
        var h = [String]()
        h.append(String(y))
        let display:String = h.joinWithSeparator(", ")

        winningNums.text = display
        print (display)

    }    
}

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

1 ответ

Решение

Основной проблемой здесь является то, что ваш массив создается заново в каждой итерации цикла, а ваша метка устанавливается в каждой итерации цикла. Это означает, что массив будет когда-либо содержать только элемент, созданный в этой итерации, после чего он сбрасывается в новый массив и добавляется новый элемент. Массив должен быть инициализирован один раз в начале, и элементы должны быть добавлены к нему в цикле, а затем помещены в метку один раз в конце.

@IBAction func generateBtn(sender: UIButton) {
    guard let startText = strtNum.text, let start = UInt32(startText),
          let endText = endNum.text, let end = UInt32(endText),
          let ttlText = amtNums.text, let ttlNums = UInt32(ttlText) else {
              //one of these is nil, handle it gracefully here
              return
          }

    let randomGenerator = RandomNum()

    var h = [String]()
    h.reserveCapacity(ttlNums)
    for _ in 0..<ttlNums {
        let randomNum = randomGenerator.rndNumGen(start, end: end)
        h.append(String(RandomNum))
    }

    let display = h.joinWithSeparator(", ")

    winningNums.text = display
    print(display)
}

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

  1. Не заставляйте разматывать. Используйте if let или же guard let привязка для безопасной обработки нулевых значений.
  2. Дайте вашим переменным значимые имена. Избегайте однобуквенных имен, за исключением особых случаев.
  3. Не ставьте пробелы рядом с именем функции / метода и последующими скобками.
  4. Не используйте цикл while для итерации по известному диапазону. Вместо этого используйте for in петля.
  5. Не набирайте t3xtspk, он выглядит так, как будто его запутал подросток. Автозаполнение завершит слова для вас, так что вы все равно в конечном итоге печатать. Сделать это легко и читабельно.

Я бы посоветовал вам сделать несколько изменений самостоятельно:

  1. переименовывать generateBtn, Функции / методы делают вещи, это действия. Их следует называть глаголами или глагольными фразами. Возможно, попробовать что-то вроде displayRandomArray,
  2. Измените генерацию случайного массива на собственный метод.
  3. переименовывать RandomNum, Судя по всему, это вовсе не число, это генератор случайных чисел. Возможно попробовать RandomNumberGenerator
  4. переименовывать h,
  5. Добавьте код, чтобы разобраться с тем, что происходит, когда .text ноль, или что происходит, когда он содержит строку, которая не является UInt32 (таким образом вызывая UInt32 инициализатор сбой и возврат nil)
Другие вопросы по тегам