Timer类计数未递增问题求助:代码无报错但计数无法增长
问题分析与解决方法
嘿,我一眼就瞅出你代码里的问题啦!你的计数始终没法递增,核心原因是**count变量的作用域不对**——你把它声明在myTestFunc()函数内部了:
@objc func myTestFunc() { var count = 0 // 每次调用这个函数,count都会被重新初始化为0 count+=1 myTimerLabel.text = String(count) }
每次定时器触发调用myTestFunc()时,都会重新创建一个count变量并赋值为0,然后加1变成1,所以标签永远显示1,看起来完全没递增。
解决方法1:把count改成实例变量(最直观的方式)
把count移到类的作用域里,让它成为一个能在多次函数调用间保持值的属性:
@IBOutlet weak var myTimerLabel: UILabel! var count = 0 // 把count变成实例变量,放在函数外面 @objc func myTestFunc() { count += 1 myTimerLabel.text = String(count) } override func viewDidLoad() { Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(myTestFunc), userInfo: nil, repeats: true) }
这样每次调用myTestFunc()时,都会累加同一个count变量的值,标签就能正常显示递增的数字了。
解决方法2:用闭包式Timer(更符合Swift现代写法)
如果你不想额外声明实例变量,可以用Timer.scheduledTimer(withTimeInterval:repeats:block:)的闭包形式,让计数变量被闭包捕获,持续保持状态:
@IBOutlet weak var myTimerLabel: UILabel! override func viewDidLoad() { var count = 0 Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] timer in count += 1 self?.myTimerLabel.text = String(count) // 如果需要停止定时器,还能在这里加判断,比如count >= 10时调用timer.invalidate() } }
记得加上[weak self]避免循环引用,防止内存泄漏哦。
内容的提问来源于stack exchange,提问作者lulzo
相关产品推荐
相关产品推荐

