ios - 为什么我不能更改 Timer.scheduledTimer 函数中变量的值?
问题描述
当我尝试在 Timer 函数中更改累积时间的值时,累积时间的值保持不变。
import UIKit
class WelcomeViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
titleLabel.text = ""
var accumulatedTime = 0.0
let logo = "Hello World"
for letter in logo {
Timer.scheduledTimer(withTimeInterval: accumulatedTime*0.1, repeats: false) { (timer) in
self.titleLabel.text?.append(letter)
accumulatedTime += 1 // increase the value of variable inside block function
}
print(accumulatedTime)
}
}
}
// Output is 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
但是如果我将“accumulatedTime += 1”移到 Timer.scheduledTimer 的块函数之外,accumulatedTime 的值可以再次更改。
import UIKit
class WelcomeViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
titleLabel.text = ""
var accumulatedTime = 0.0
let logo = "Hello World"
for letter in logo {
Timer.scheduledTimer(withTimeInterval: accumulatedTime*0.1, repeats: false) { (timer) in
self.titleLabel.text?.append(letter)
}
accumulatedTime += 1 // increase the value of variable outside block function
print(accumulatedTime)
}
}
}
// Output is 1.0, 2.0, 3.0, 4.0, 5.0...
我很好奇为什么我不能在 Timer.scheduledTimer 的块函数中更改局部变量的值,你们能帮我理解这个内部逻辑吗.. 谢谢
解决方案
for letter in logo {
Timer.scheduledTimer(withTimeInterval: accumulatedTime*0.1, repeats: false) { (timer) in
self.titleLabel.text?.append(letter)
accumulatedTime += 1 // increase the value of variable inside block function
}
print(accumulatedTime)
}
打印语句在闭包执行之前运行...这就是为什么它们都是 0 ..因为当您的打印代码在 for 循环中执行时它不会被设置...在闭包中执行打印语句
for letter in logo {
Timer.scheduledTimer(withTimeInterval: accumulatedTime*0.1, repeats: false) { (timer) in
self.titleLabel.text?.append(letter)
accumulatedTime += 1 // increase the value of variable inside block function
print(accumulatedTime)// print 1,2,3 .. 11
}
}
在闭包中,它的值正在改变......并且您可以在闭包执行时访问更改的值..
推荐阅读
- linux - 网络错误:AWS EC2 实例中的连接被拒绝
- c# - 是否可以在没有设置器的情况下在属性中设置值?
- python - 在 while 循环中复制到 Postgres
- python - Pygame 碰撞检测无法正常工作
- c++ - 重载运算符 - 无法在赋值中将对象转换为基类型
- c# - C# - 存储变量和用户设置(变量和设置的数量未预定义)
- wordpress - 有没有办法将 wordpress 项目从 Windows 机器转移到 Mac?
- c - OpenMp C 文件输出
- javascript - 使用 Google Pay JavaScript API 时防止客户端篡改
- laravel - 如何在服务实现中进行数据表自然排序?