Swift:如何阻止计时器从循环开始?

时间:2018-01-06 13:19:25

标签: ios swift

我获得了一些Swift代码来打印特定单词("stackoverflow")的每个字符,并且还有特定的延迟(1.0s)

要了解我的想法,请查看伪代码:

print("s")
wait(1s)
print("t")
wait(1s)
print("a")
wait(1s)
print("c")
wait(1s)
print("k")
wait(1s)
...


好的 - 下面你可以找到我用Swift编写的代码:

var mystring="stackoverflow"
var counter=0.0

for i in mystring {
  Timer.scheduledTimer(
     timeInterval: Double(counter),
     target: self,
     selector: #selector(self.myfunc(_:)),
     userInfo: String(i),
     repeats: false)
     counter=counter+1.0
   })
}
func myfunc(_ timer: Timer) {
    let value: String? = timer.userInfo! as? String
    print ("Value: \(value as String?)")
}

但是,在for循环结束后怎么可能杀死所有myfunc - 调用? 如何杀死我没有用变量声明的不同定时器,以避免覆盖最后一个定时器 ??

2 个答案:

答案 0 :(得分:2)

为什么不一个计时器和几行额外的逻辑。当计时器触发时,代码打印字符串的第一个字符,然后删除第一个字符,直到字符串为空。最后,计时器失效。

let string = "stackoverflow"

var temp = Substring(string)
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    print(temp.prefix(1))
    temp = temp.dropFirst()
    if temp.isEmpty { timer.invalidate() }
}

或作为股票代码

let string = "stackoverflow"

var counter = 1
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
    print(string.prefix(counter))
    if counter == string.count  { timer.invalidate() }
    counter += 1
}

答案 1 :(得分:-2)

编辑:对于那些认为这不是最好的答案的人来说,这对他目前的编程技术来说是最好的,并且在这里提出一个好的解决方案是针对他的主要问题编辑部分的解决方案,完全没有计时器

编辑://////

var counter = 0.0

for i in mystring {

 DispatchQueue.main.asyncAfter(deadline: .now() + counter) {

  print("\(String(i))")

  }

 counter = counter + 1

}

/////////

声明var

  var timerarr = [Timer] = []

然后将每个创建的计时器添加到数组

  for i in mystring {
      let t = Timer.scheduledTimer(
      timeInterval: Double(counter),
      target: self,
      selector: #selector(self.myfunc(_:)),
      userInfo: String(i),
      repeats: false)
      counter=counter+1.0     
      })
      timerarr.append(t)
   }

并循环停止

 for i in 0..<timerarr.count {
    let tim = timerarr[i]
    tim.invalidate()  
 }

 timearr = []