首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSTimer问题(闭包、@objc等)

NSTimer问题(闭包、@objc等)
EN

Stack Overflow用户
提问于 2015-06-18 01:31:19
回答 1查看 282关注 0票数 1

我对斯威夫特非常陌生,我有一些关于斯威夫特的问题,甚至只是一些基本的面向对象(所以如果可以的话,请给出你的答案,非常感谢!)

因此,我正在制作一个具有计时器组件的应用程序,下面的代码片段来自那个timer类(以及视图控制器):

  1. 我有停止/启动函数和deinit:
代码语言:javascript
运行
复制
var timer = NSTimer()
...
func start(){
    self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "tick", userInfo: nil, repeats: true)
}
func stop(){
    timer.invalidate()
}
....
deinit(){
    self.timer.invalidate()
}

因此,我的第一个问题是,为什么我需要在deinit中调用self.timer并启动,而不是停止?另外,deinit什么时候被调用,它与停止函数有什么不同(在我看来,它们都使NSTimer失效)?

  1. 还有一个初始化程序:
代码语言:javascript
运行
复制
init (duration: Int, handler: (Int) -> ()){
    self.duration = duration
    self.handler = handler
}

并在视图控制器中调用初始化程序:

代码语言:javascript
运行
复制
private func timerSetUP(hr: Bool, duration: Int){
    timer = Timer(duration: duration){
        (elapsedTime: Int) -> () in
        let timeRemaining = duration - elapsedTime
        println("what is the eT: \(elapsedTime)")
        let timeReStr = self.getHrMinSecLabels(hr, timeremaining: timeRemaining)
    ....}

我的问题是闭包,elapsedTime是Timer类中的一个属性,它只是被传递到视图控制器中的闭包中吗?为什么没有对Timer类的引用(比如timer.elapsedTime)?我也不需要这个了结,对吧?我可以有另一个函数来做同样的事情(或者使用这个闭包更容易获得elapsedTime )?

  1. 在我的计时器类中还有一个滴答函数:
代码语言:javascript
运行
复制
@objc func tick(){
    self.elapsedTime++
    self.handler(elapsedTime)
    if self.elapsedTime == self.duration{
        self.stop()
    }
}

这是self.timer = NSTimer.scheduledTimerWithTimeInterval()的选择器,选择器只是每次计时器触发时都会被调用的函数吗?我是否只需要给NSTimer.scheduledTimerWithTimeInterval()选择器函数的字符串名称呢?此外,为什么会有@objc,这在我看来只是一个快速的函数?

EN

Stack Overflow用户

回答已采纳

发布于 2015-06-18 03:14:38

你的问题都写满了。让我试着一次对他们说一遍:

为什么我需要调用self.timerdeinitstart中,而不是在stop

这是个人编码风格。假设没有一个局部变量覆盖实例变量,self.timertimer是相同的。

另外,deinit什么时候被调用,它与stop函数有什么不同?

当运行时释放对象时,将调用deinit。如果你的计时器在那个时候还在运行,它需要先停止它。stop只是停止计时器,但将对象保存在内存中。

我的问题是关于闭包,elapsedTimeTimer类中的一个属性.

你需要了解一些结论。elapsedTime是闭包/匿名函数的参数。当计时器触发时,Timer对象将其elapsedTime属性传递给该匿名函数。如果您将它重命名为这样,则使用相同的方法:

代码语言:javascript
运行
复制
timer = Timer(duration: duration){
    (t : Int) -> () in
    let timeRemaining = duration - t
    println("what is the eT: \(t)")
    let timeReStr = self.getHrMinSecLabels(hr, timeremaining: timeRemaining)
....}

选择器是否只是每次计时器触发时都会被调用的函数?

是。但是您需要指定调用函数的对象(请参见下一个问题中的target参数)。

我是否只需要给NSTimer.scheduledTimerWithTimeInterval()选择器函数的字符串名称呢?

是的,就像这样:

代码语言:javascript
运行
复制
// Fire the tellTime() function of the current object every second (1000ms)
self.timer = NSTimer.scheduledTimerWithTimeInterval(
                        timeInterval: 1000,
                        target: self,
                        selector: "tellTime",
                        userInfo: nil,
                        repeats: true)

另外,为什么会有@objc,在我看来,这只是一个快速的函数?

这是为了使Objective代码了解您的Swift函数。如果你专门用Swift编程,你可以跳过它。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30905096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档