在Swift 5中的while循环遇到麻烦

时间:2019-09-07 17:37:58

标签: swift while-loop

从本质上讲,我正在开发一款有关虚拟狗的应用程序,以帮助人们照顾他们的狗。屏幕之一可以让您用十五秒的时间宠爱狗五次。每当我尝试加载屏幕时,该应用程序都会冻结。代码在viewDidLoad()内部

while timesPetted < 5 {
            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
                timer += 1
                if timer == 15 {
                    self.failureLabel.isHidden = false
                    self.reset.isHidden = false
                    self.timesPetted = 0
                }

            })
        }

当我删除while循环时,屏幕可以正常加载并完美运行,但是(显然)没有时间限制。如果将while循环移出viewDidLoad(),则会收到一条错误消息,提示Xcode为“期望的声明”。

2 个答案:

答案 0 :(得分:1)

请使用设置为在15秒后过期的计时器

let timer = Timer.scheduledTimer(withTimeInterval: 15.0, repeats: false) { timer in
    self.failureLabel.isHidden = false
    self.reset.isHidden = false
    self.timesPetted = 0
 }

或者如果您想使用DispatchQueue,则只能使用一次

DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
    self.failureLabel.isHidden = false
    self.reset.isHidden = false
    self.timesPetted = 0
}

答案 1 :(得分:0)

由于timesPetted的值,它显示while循环无限运行。一旦进入while循环,timesPetted的值就不会改变。

要解决您的问题,您可以如下更改代码:-

您必须在代码中的某些位置更新timesPetted值。 可以说,timesPetted在名为“ Petting”的函数中已更改,因此在调用此功能时要进行检查,这限制了用户只能进行5次检查直到进行15秒的检查。如下所示。

   func petting() {
      if reset.isHidden && timesPetted <= 5{ // here the reset.isHidden will become false in DispatchQueue (present in viewDidLoad) once the 15 seconds have been passed.
         timesPetted += 1
      }
   }

还要确保将这行代码添加到viewDidLoad中。

   DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
      self.failureLabel.isHidden = false
      self.reset.isHidden = false
      self.timesPetted = 0
   }