gpt4 book ai didi

swift - 在 Swift 中更改定时器选择器函数中的 userInfo

转载 作者:可可西里 更新时间:2023-11-01 00:38:08 27 4
gpt4 key购买 nike

每次定时器触发时,我都想在选择器函数中更新定时器的 userInfo。

用户信息:

var timerDic  = ["count": 0]

计时器:

Init:     let timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:     Selector("cont_read_USB:"), userInfo: timerDic, repeats: true)

选择器函数:

public func cont_read_USB(timer: NSTimer)
{
if var count = timer.userInfo?["count"] as? Int
{
count = count + 1

timer.userInfo["count"] = count
}
}

最后一行出现错误:

'AnyObject?' does not have a member named 'subscript'

这里有什么问题?在 Objective_C 中,此任务使用 NSMutableDictionary 作为 userInfo

最佳答案

为了让它工作,将 timerDic 声明为 NSMutableDictionary:

var timerDic:NSMutableDictionary = ["count": 0]

然后在您的cont_read_USB 函数中:

if let timerDic = timer.userInfo as? NSMutableDictionary {
if let count = timerDic["count"] as? Int {
timerDic["count"] = count + 1
}
}

讨论:

  • Swift 字典是值类型,所以如果你想更新它,你必须传递一个对象。通过使用 NSMutableDictionary,您可以获得一个通过引用传递的对象类型,并且可以对其进行修改,因为它是一个可变字典。

Swift 4+ 的完整示例:

如果您不想使用NSMutableDictionary,您可以创建自己的。下面是一个使用自定义 class 的完整示例:

import UIKit

class CustomTimerInfo {
var count = 0
}

class ViewController: UIViewController {

var myTimerInfo = CustomTimerInfo()

override func viewDidLoad() {
super.viewDidLoad()

_ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: myTimerInfo, repeats: true)
}

@objc func update(_ timer: Timer) {
guard let timerInfo = timer.userInfo as? CustomTimerInfo else { return }

timerInfo.count += 1
print(timerInfo.count)
}

}

当您在模拟器中运行它时,打印的 count 每秒都会增加。

关于swift - 在 Swift 中更改定时器选择器函数中的 userInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26698481/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com