在 swift 操场上使用 NSTimer

Using NSTimer in swift playground

我想知道如何在 Swift 游乐场中使用 NSTimerThis question has been asked before,但 none 的答案实际上回答了问题。

这是我的游乐场代码:

import Foundation

class MyClass {

    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: nil, repeats: true)
    }

    func onTimer(timer:NSTimer!) {
        println("Timer here")
    }
}

var anInstance = MyClass()

anInstance.startTimer()

scheduledTimerWithTimeInterval 实例化 NSTimer 创建计时器 并且 将其安排在当前 运行 循环中。

但从未调用方法 onTimer。为什么?

首先,您的 onTimer 方法必须声明为 @objc,否则 NSTimer 找不到它。

至于你的问题,是因为你还没有开始运行循环。

要做到这一点,CFRunLoopRun() 是我认为最简单的解决方案。

import Foundation

class MyClass {

    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: nil, repeats: true)
    }

    @objc func onTimer(timer:NSTimer!) {
        println("Timer here")
    }
}

var anInstance = MyClass()

anInstance.startTimer()

CFRunLoopRun() // <-- HERE!

为了完整起见,正如@MartinR 在评论中提到的,您还可以使用 XCPSetExecutionShouldContinueIndefinitely()

import Foundation
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely()

class MyClass {

    func startTimer() {
        NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: nil, repeats: true)
    }

    @objc func onTimer(timer:NSTimer!) {
        println("Timer here")
    }
}

var anInstance = MyClass()

anInstance.startTimer()

在这种情况下,Playground 运行仅在时间轴中指定秒数: