我想每5秒执行以下功能。我已经看到了使用NSTimer.scheduledTimerWithTimeInterval
的相关问题的其他答案,但这只适用于没有任何参数的函数。
功能:
func sayHello(name: String) {
println("Hey \(name)!")
}
这是我尝试过的代码:
var timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("sayHello(\(name))"), userInfo: nil, repeats: true)
但它崩溃了应用程序并出现错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[Jake.SwiftApp sayHello(jake)]: unrecognized
selector sent to instance 0x7fcd515640a0'
如何使用一个输入参数运行该函数?
答案 0 :(得分:2)
我相信你可以让你的函数以NSTimer
作为参数,然后允许你像userInfo
那样发送你的数据。
var timer : NSTimer = NSTimer(timeInterval: 5.0, target: self, selector: Selector("sayHello:"), userInfo: "Jake", repeats: true)
func sayHello(timer: NSTimer) {
println(timer.userInfo)
}
我还没有能够测试这个,所以计时器可能会出错,但我认为逻辑是正确的。
答案 1 :(得分:2)
问题是,当您设置要激活NSTimer
的选择器时,您必须只传递方法的名称。
现在,您正在动态构建字符串并尝试指向名为的方法:
"sayHello(jake)"
哪个不存在。事实上,在无法存在。这甚至没有意义。
如果您将sayHello()
乐趣添加为带字符串的选择器,则"sayHello:"
乐趣会如此:
NSTimer
但是解决这个问题仍然存在问题。 NSTimer
的目标可以采用零个或一个参数。如果它确实需要参数,那么它希望该参数为NSTimer
。当func sayHello(timer: NSTimer) {
// do stuff
}
点击并调用目标时,他们会将自己作为参数传递。
因此,我们需要设置我们的方法:
Selector("sayHello:")
现在我们将AnyObject?
传递给我们的选择器参数。
为了传递任何类型的参数,我们必须将它们打包到NSTimer
's userInfo
property,其类型为class ExampleClass {
var timer: NSTimer?
var userName: String? {
set {
self.timer?.userInfo = newValue
}
get {
return self.timer?.userInfo as? String
}
}
func timerTick(timer: NSTimer) {
if let userName = timer.userInfo as? String {
self.sayHello(userName)
}
}
func sayHello(userName: String) {
println("Hello " + userName + "!")
}
func startTimer(#interval: NSTimeInterval = 5.0, userName: String? = nil) {
self.timer = NSTimer.scheduledTimerWithTimeInterval(interval,
target: self,
selector: Selector("timerTick:"),
userInfo: userName,
repeats: true
)
}
}
。然后,在我们的计时器调用的方法中,我们可以访问此属性。
self.userName = "Jake"
从这里开始,只要你想改变计时器随身携带的名字,你就可以这样做:
reply "[ {
"interface" : [ {
"name" : "ethernet39",
"number" : 39,
"rate" : [ {
"interval" : 45,
"rx-bad-vlan-rate" : 0,
"rx-broadcast-packet-rate" : 0,
"rx-byte-rate" : 0,
"rx-drop-rate" : 0,
"rx-error-rate" : 0,
"rx-multicast-packet-rate" : 0,
"rx-unicast-packet-rate" : 0,
"timestamp" : "2015-06-18T21:59:23.703Z",
"tx-broadcast-packet-rate" : 0,
"tx-byte-rate" : 0,
"tx-drop-rate" : 0,
"tx-error-rate" : 0,
"tx-multicast-packet-rate" : 0,
"tx-unicast-packet-rate" : 0
}, {
"interval" : 45,
"rx-bad-vlan-rate" : 0,
"rx-broadcast-packet-rate" : 0,
"rx-byte-rate" : 0,
"rx-drop-rate" : 0
...