为啥我不能更改 Timer.scheduledTimer 函数中变量的值?

Posted

技术标签:

【中文标题】为啥我不能更改 Timer.scheduledTimer 函数中变量的值?【英文标题】:Why I cannot change the value of variable inside Timer.scheduledTimer function?为什么我不能更改 Timer.scheduledTimer 函数中变量的值? 【发布时间】:2020-05-22 20:05:36 【问题描述】:

当我尝试在 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的block函数外面,就可以再次改变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 的块函数中改变局部变量的值,你们能帮我理解这个内部逻辑吗..谢谢

【问题讨论】:

【参考方案1】:
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
                

            

在闭包中,它的值正在改变...并且您可以在闭包执行时访问更改的值..

【讨论】:

以上是关于为啥我不能更改 Timer.scheduledTimer 函数中变量的值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能使用 onsubmit 来更改 innerHTML?

为啥我不能更改 Timer.scheduledTimer 函数中变量的值?

为啥我不能更改已定义元素的类名

为啥我不能更改 QMap 中的 Qvariant 值?

为啥我的 Java 方法不能更改传递的变量? [复制]

为啥我不能通过 android:theme 更改hintTextAppearance?