Положить массив в метку в 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:
- Не заставляйте разматывать. Используйте
if let
или жеguard let
привязка для безопасной обработки нулевых значений. - Дайте вашим переменным значимые имена. Избегайте однобуквенных имен, за исключением особых случаев.
- Не ставьте пробелы рядом с именем функции / метода и последующими скобками.
- Не используйте цикл while для итерации по известному диапазону. Вместо этого используйте
for in
петля. - Не набирайте t3xtspk, он выглядит так, как будто его запутал подросток. Автозаполнение завершит слова для вас, так что вы все равно в конечном итоге печатать. Сделать это легко и читабельно.
Я бы посоветовал вам сделать несколько изменений самостоятельно:
- переименовывать
generateBtn
, Функции / методы делают вещи, это действия. Их следует называть глаголами или глагольными фразами. Возможно, попробовать что-то вродеdisplayRandomArray
, - Измените генерацию случайного массива на собственный метод.
- переименовывать
RandomNum
, Судя по всему, это вовсе не число, это генератор случайных чисел. Возможно попробоватьRandomNumberGenerator
- переименовывать
h
, - Добавьте код, чтобы разобраться с тем, что происходит, когда
.text
ноль, или что происходит, когда он содержит строку, которая не является UInt32 (таким образом вызываяUInt32
инициализатор сбой и возвратnil
)