将数组放入 swift 中的标签
Putting array into label in 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)
}
}
我不知道这段代码有什么问题。我试图将字符串显示到标签中,并从随机数生成器中打印出最后一个数字。当我将它打印到控制台时,它会显示所有随机数。
这里的主要问题是您的数组在每次循环迭代中都是全新创建的,并且您的标签是在每次循环迭代中设置的。这意味着数组将只包含在该迭代中创建的元素,之后它被重置为一个新数组,并添加一个新元素。数组需要在开始时初始化一次,在循环中重复添加元素,最后一次放入标签。
@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
绑定来安全地处理 nil 值。
- 给你的变量起有意义的名字。除特定情况外,避免使用单字母名称。
- 不要在 function/method 名称和前面的括号旁放置空格。
- 不要使用 while 循环遍历已知范围。相反,使用
for in
循环。
- 不要输入 t3xtspk,它让你的代码看起来像是一个愤怒的青少年写的。自动完成会为您完成单词,因此您几乎不会打字。使其简单易读。
我建议你自己做一些改变:
- 重命名
generateBtn
。 Functions/methods 做事,就是行动。它们应该用动词或动词短语命名。也许尝试 displayRandomArray
.
- 将随机数组生成重构为它自己的方法。
- 重命名
RandomNum
。看样子,根本不是数字,是随机数generator。也许试试 RandomNumberGenerator
- 重命名
h
.
- 添加代码来处理当
.text
为 nil 时发生的情况,或者当它包含不是 UInt32 的字符串时发生的情况(从而导致 UInt32
初始化程序失败并且 return nil
)
@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)
}
}
我不知道这段代码有什么问题。我试图将字符串显示到标签中,并从随机数生成器中打印出最后一个数字。当我将它打印到控制台时,它会显示所有随机数。
这里的主要问题是您的数组在每次循环迭代中都是全新创建的,并且您的标签是在每次循环迭代中设置的。这意味着数组将只包含在该迭代中创建的元素,之后它被重置为一个新数组,并添加一个新元素。数组需要在开始时初始化一次,在循环中重复添加元素,最后一次放入标签。
@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
绑定来安全地处理 nil 值。 - 给你的变量起有意义的名字。除特定情况外,避免使用单字母名称。
- 不要在 function/method 名称和前面的括号旁放置空格。
- 不要使用 while 循环遍历已知范围。相反,使用
for in
循环。 - 不要输入 t3xtspk,它让你的代码看起来像是一个愤怒的青少年写的。自动完成会为您完成单词,因此您几乎不会打字。使其简单易读。
我建议你自己做一些改变:
- 重命名
generateBtn
。 Functions/methods 做事,就是行动。它们应该用动词或动词短语命名。也许尝试displayRandomArray
. - 将随机数组生成重构为它自己的方法。
- 重命名
RandomNum
。看样子,根本不是数字,是随机数generator。也许试试RandomNumberGenerator
- 重命名
h
. - 添加代码来处理当
.text
为 nil 时发生的情况,或者当它包含不是 UInt32 的字符串时发生的情况(从而导致UInt32
初始化程序失败并且 returnnil
)