无法调用scheduledTimer

时间:2015-05-26 13:43:20

标签: ios swift cocoa-touch

我有这个非常简单的代码来触发计时器:

var timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(2), target: self, selector: "timerDidFire:", userInfo: nil, repeats: true)

然而它给了我:

Cannot invoke 'scheduledTimerWithTimeInterval' with an argument list of type '(Double, target: TestVC -> () -> TestVC, selector: String, userInfo: nil, repeats: Bool)'

这没有任何意义,我的参数类型与所需的完全匹配。

这是功能定义:

scheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> NSTimer

我做错了什么?

3 个答案:

答案 0 :(得分:4)

在属性的初始值表达式中使用时

 class TestVC : UIViewController (

      var timer = ... some expression using `self` ...

      // ...
 }

self 不是 TestVC的一个实例,而是一个" curried函数"类型

  TestVC -> () -> TestVC

以及奇怪的错误消息来自哪里。实例本身就是 此时尚未完全初始化。这类似于 ViewController.Type does not have a member named中的问题,可以在此处应用相同的解决方案:

将变量声明为可选(或隐式展开的可选) 并在一些方法中初始化它,例如在viewDidLoad

class TestVC: UIViewController {

    var timer : NSTimer?

    override func viewDidLoad() {
        super.viewDidLoad()
        timer = NSTimer.scheduledTimerWithTimeInterval( ... )
    }

    // ...
}

答案 1 :(得分:1)

Swift的编译器错误通常非常糟糕。如果他们似乎没有意义,那可能是因为他们没有。

当你遇到一个没有意义的编译器错误时,请记住把它转换为"这条线路有问题。我不知道是什么,所以我要编造一些完全不相关的东西并报告。"

或者只是" Derp?"

我的钱用在timerDidFire方法上。发布该方法的函数定义。

此外,接收NSTimer方法的类必须是Objective-C类。通常它是一个UIViewController,所以你不需要任何特殊的东西,因为所有的视图控制器都继承自NSObject。

答案 2 :(得分:0)

这对Swift来说非常合适:

1) var updateTimer:NSTimer?

2) 在viewDidLoad中: updateTimer = NSTimer.scheduledTimerWithTimeInterval(Double(2),target:self,selector:Selector(" updateB:"),userInfo:nil,repeats:true)

3) func updateB(timer:NSTimer!){   ... }

希望它有所帮助...