如何在Swift中每5秒运行一个带参数的函数?

时间:2015-06-18 23:24:39

标签: swift cocoa nstimer

我想每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'

如何使用一个输入参数运行该函数?

2 个答案:

答案 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
...