代码的意图是每次按下按钮时产生一个随机练习和数量的代表(从数组中选择)。
但是,按钮仅在第一次按下时才会执行此操作,此后不再执行此操作。
问题:每次推送按钮时,如何确保按钮会生成随机数量的代表和练习(从我的数组中选择)?
import UIKit
class ViewController: UIViewController
{
var clickCount = 0
let exercises = ["Push Ups", "Squats", "Burpees", "Sit Ups"]
let reps = ["5", "6", "7", "8", "9", "10"]
lazy var randomIndex1 = Int(arc4random() % UInt32(exercises.count))
lazy var randomIndex2 = Int(arc4random() % UInt32(reps.count))
@IBOutlet weak var countLabel: UILabel!
@IBOutlet weak var excerciseType: UILabel!
@IBOutlet weak var repVolume: UILabel!
@IBAction func buttonPress(_ sender: UIButton) {
clickCount+=1
countLabel.text="You've Tapped \(clickCount) times"
excerciseType.text="\(exercises[randomIndex1])"
repVolume.text="\(reps[randomIndex2])"
}
}
答案 0 :(得分:2)
您的lazy
初始化变量在延迟初始化后不会更改其值。
使用计算变量,它们会在每次访问时返回新值:
var randomIndex1 : Int {
return Int(arc4random_uniform(UInt32(exercises.count))
}
var randomIndex2 : Int {
return Int(arc4random_uniform(UInt32(reps.count))
}
代码使用更合适的API arc4random_uniform
答案 1 :(得分:2)
通过将变量放在buttonPress
方法
所以,我会删除这两行
lazy var randomIndex1 = Int(arc4random() % UInt32(exercises.count))
lazy var randomIndex2 = Int(arc4random() % UInt32(reps.count))
并在buttonPress中设置这些值
@IBAction func buttonPress(_ sender: UIButton) {
clickCount+=1
let randomIndex1 = Int(arc4random() % UInt32(exercises.count))
let randomIndex2 = Int(arc4random() % UInt32(reps.count))
countLabel.text="You've Tapped \(clickCount) times"
excerciseType.text="\(exercises[randomIndex1])"
repVolume.text="\(reps[randomIndex2])"
}
现在每次按下按钮时都应该生成一个新的随机值。正如Leo在评论中所说,由于我们每次都在重新生成它们,因此它们应该是let
而不是var
注意的
我最初提到了一些关于懒惰变量的东西,因为它们似乎在这里不需要。所以,如果你阅读评论并想知道人们在谈论什么;这就是我最初所说的,这对OP提出的问题并没有真正的帮助,也不清楚;所以我将它移到这里注意:
一些事情:
- lazy var实际上是一个常量(或者至少在很多地方被视为一个)
答案 2 :(得分:1)
要使您的随机数发生器可重复使用,您应将其移至新功能中。为了这个答案,我将其称为randomize()
。你可以像这样实现:
import UIKit
class ViewController: UIViewController {
var clickCount = 0
let exercises = ["Push Ups", "Squats", "Burpees", "Sit Ups"]
let reps = ["5", "6", "7", "8", "9", "10"]
lazy var randomIndex1 = Int(arc4random() % UInt32(exercises.count))
lazy var randomIndex2 = Int(arc4random() % UInt32(reps.count))
@IBOutlet weak var countLabel: UILabel!
@IBOutlet weak var excerciseType: UILabel!
@IBOutlet weak var repVolume: UILabel!
@IBAction func buttonPress(_ sender: UIButton) {
clickCount+=1
countLabel.text="You've Tapped \(clickCount) times"
self.randomize()
}
func randomize() {
self.randomIndex1 = Int(arc4random() % UInt32(exercises.count))
self.randomIndex2 = Int(arc4random() % UInt32(reps.count))
self.excerciseType.text="\(exercises[randomIndex1])"
self.repVolume.text="\(reps[randomIndex2])"
}
}