Ios 需要按钮多次重复相同的功能

Ios 需要按钮多次重复相同的功能,ios,arrays,swift,button,random,Ios,Arrays,Swift,Button,Random,该代码的目的是在每次按下按钮时生成一个随机练习和从数组中选择的重复次数 但是,该按钮仅在第一次按下时执行此操作,此后不再执行 问题:我如何确保每次按下该按钮时,都会从我的阵列中随机生成多次重复和练习 import UIKit class ViewController: UIViewController { var clickCount = 0 let exercises = ["Push Ups", "Squats", "Burpees", "Sit Ups"]

该代码的目的是在每次按下按钮时生成一个随机练习和从数组中选择的重复次数

但是,该按钮仅在第一次按下时执行此操作,此后不再执行

问题:我如何确保每次按下该按钮时,都会从我的阵列中随机生成多次重复和练习

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])"

    }

}
惰性初始化变量在惰性初始化后不会更改其值

改为使用计算变量,这些变量在每次访问时返回新值:

var randomIndex1 : Int {
    return Int(arc4random_uniform(UInt32(exercises.count))
}

var randomIndex2 : Int {
    return Int(arc4random_uniform(UInt32(reps.count))
}
代码使用更合适的API arc4random_uniform

惰性初始化变量在惰性初始化后不会更改其值

改为使用计算变量,这些变量在每次访问时返回新值:

var randomIndex1 : Int {
    return Int(arc4random_uniform(UInt32(exercises.count))
}

var randomIndex2 : Int {
    return Int(arc4random_uniform(UInt32(reps.count))
}

该代码使用更合适的API arc4random_uniform

使随机化器可重用,您应该将其移动到一个新函数中。为了这个答案,我称之为随机化。您可以这样实现:

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])"
  }

}

为了使随机化器可重用,您应该将其移动到一个新函数中。为了这个答案,我称之为随机化。您可以这样实现:

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])"
  }

}

通过将变量放入buttonPress方法中生成新值

所以,我要删除这两行

   lazy var randomIndex1 = Int(arc4random() % UInt32(exercises.count))
   lazy var randomIndex2 = Int(arc4random() % UInt32(reps.count))
并在按键内设置这些值

 @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])"

 }
现在它应该在每次按下按钮时生成一个新的随机值。正如利奥在评论中所说,由于我们每次都在重新生成它们,所以它们应该被释放,而不是被释放

我最初提到了一些关于懒惰的变量,因为这里似乎不需要它们。所以,如果你读了评论,想知道人们在谈论什么;这是我最初说的,这对OP的问题没有帮助,也不清楚;所以我把它移到这张纸条上:

有几件事:

一个惰性变量实际上是一个常量,或者至少在很多地方它被当作一个常量来对待
通过将变量放入buttonPress方法中生成新值

所以,我要删除这两行

   lazy var randomIndex1 = Int(arc4random() % UInt32(exercises.count))
   lazy var randomIndex2 = Int(arc4random() % UInt32(reps.count))
并在按键内设置这些值

 @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])"

 }
现在它应该在每次按下按钮时生成一个新的随机值。正如利奥在评论中所说,由于我们每次都在重新生成它们,所以它们应该被释放,而不是被释放

我最初提到了一些关于懒惰的变量,因为这里似乎不需要它们。所以,如果你读了评论,想知道人们在谈论什么;这是我最初说的,这对OP的问题没有帮助,也不清楚;所以我把它移到这张纸条上:

有几件事:

一个惰性变量实际上是一个常量,或者至少在很多地方它被当作一个常量来对待
在按钮操作函数中移动随机索引。按照您现在的方式,它们在您第一次使用它们时会被延迟初始化,并且数字不会更改。推荐。不要使用arc4random(这可能导致),而是使用。将随机索引移动到按钮操作函数中。按照您现在的方式,它们在您第一次使用它们时会被延迟初始化,并且数字不会更改。推荐。不要使用arc4random,这可能会导致,而是使用。你能举出一个懒惰的变量实际上是一个常数吗?一个懒惰的变量不是一个常数。所有的惰性变量都是在实际需要时才计算初始值的变量。很多人认为它们是不变的,但这并不是以任何方式强制执行的,也不是设计它们的方式。此外,在函数randomIndex1和randomindex2中,可以将其定义为let而不是var,因为它们从未发生突变。除此之外,测试是正确的。。以下是最新的苹果文档中的讨论。让我想一想如何改写它。OP使用lazy并不是真正的问题,但我只是在评论它。也许我会从我的答案中去掉这一部分。是的,@supportoftruth说的比我说的更好。当我们不想在使用之前创建对象时,我们使用“lazy”,在许多情况下,它是一个常量,因为不允许有“lazy”,顺便说一句,最好使用arc4random_统一。Intarc4random_uniformUInt32exercises.count你能举出一个惰性变量实际上是一个常数吗?惰性变量不是一个常数。所有的惰性变量都是在实际需要时才计算初始值的变量。很多人认为它们是不变的,但这并不是以任何方式强制执行的,也不是设计它们的方式。此外,在函数randomIndex1和randomindex2中,可以将其定义为let而不是var,因为它们从未发生突变。除此之外,测试是正确的。。以下是最新的苹果文档中的讨论。让我想一想如何改写它。OP使用lazy并不是真正的问题,但我只是在评论它。也许我会把那部分拿出来
呃,是的,"拥护真理"说的比我说的好。当我们不想在使用之前创建对象时,我们使用“lazy”,在许多情况下,它是一个常量,因为不允许有“lazy”,顺便说一句,最好使用arc4random_统一。Intarc4random_uniformUInt32exercises.count如果只需要在单击按钮时使用它,但不会造成伤害,则它不需要是单独的函数。然而,真正的问题是,randomIndex1和randomIndex2不需要是类变量,但可以是函数的局部变量,除非它们在其他地方需要too@UpholderOfTruth你是对的。我想这只是一种选择。计算属性的答案最终是最好的-我自己对这个答案投了赞成票。我刚刚对一个计算属性进行了评论,实际上我会沿着函数的局部变量路线走,这就是为什么我对这个答案投了反对票。所以和这个答案一样,只是把所有代码都保留在按钮选择器中?我想我只是想他可能想从其他地方调用代码,但我想这在问题中从来没有提到过。如果只需要在单击按钮时使用它,那么它不需要是一个单独的函数,但不会造成伤害。然而,真正的问题是,randomIndex1和randomIndex2不需要是类变量,但可以是函数的局部变量,除非它们在其他地方需要too@UpholderOfTruth你是对的。我想这只是一种选择。计算属性的答案最终是最好的-我自己对这个答案投了赞成票。我刚刚对一个计算属性进行了评论,实际上我会沿着函数的局部变量路线走,这就是为什么我对这个答案投了反对票。所以和这个答案一样,只是把所有代码都保留在按钮选择器中?我想我只是想他可能想从其他地方调用代码,但我想问题中从未提到过这一点。虽然这可以奏效,但并不需要。只需将变量设置为函数的局部变量,而不是类实例。如果函数外部不需要这些值,则不要使它们可用,如果它们是可用的,则每次访问它们时它们都会不同,这有点毫无意义。不可能,将为真,并且它工作正常,当然有时这是合适的。例如,它允许更改randomIndex1和randomIndex2的计算方法,而不影响使用它的用户。所以它确实有优势,但是如果使用它的函数是隔离的,那么我认为最好将尽可能多的相关代码保存在一起,以确保可读性(如果没有其他功能的话)。虽然这可以工作,但它不需要。只需将变量设置为函数的局部变量,而不是类实例。如果函数外部不需要这些值,则不要使它们可用,如果它们是可用的,则每次访问它们时它们都会不同,这有点毫无意义。不可能,将为真,并且它工作正常,当然有时这是合适的。例如,它允许更改randomIndex1和randomIndex2的计算方法,而不影响使用它的用户。因此,它确实有优势,但如果使用它的函数是孤立的,那么我认为最好将尽可能多的相关代码保存在一起,以确保可读性(如果没有其他功能的话)。