我对斯威夫特非常陌生,我有一些关于斯威夫特的问题,甚至只是一些基本的面向对象(所以如果可以的话,请给出你的答案,非常感谢!)
因此,我正在制作一个具有计时器组件的应用程序,下面的代码片段来自那个timer类(以及视图控制器):
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失效)?
init (duration: Int, handler: (Int) -> ()){
self.duration = duration
self.handler = handler
}
并在视图控制器中调用初始化程序:
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
)?
@objc func tick(){
self.elapsedTime++
self.handler(elapsedTime)
if self.elapsedTime == self.duration{
self.stop()
}
}
这是self.timer = NSTimer.scheduledTimerWithTimeInterval()
的选择器,选择器只是每次计时器触发时都会被调用的函数吗?我是否只需要给NSTimer.scheduledTimerWithTimeInterval()
选择器函数的字符串名称呢?此外,为什么会有@objc,这在我看来只是一个快速的函数?
发布于 2015-06-18 03:14:38
你的问题都写满了。让我试着一次对他们说一遍:
为什么我需要调用
self.timer
在deinit
和start
中,而不是在stop
中
这是个人编码风格。假设没有一个局部变量覆盖实例变量,self.timer
与timer
是相同的。
另外,
deinit
什么时候被调用,它与stop
函数有什么不同?
当运行时释放对象时,将调用deinit
。如果你的计时器在那个时候还在运行,它需要先停止它。stop
只是停止计时器,但将对象保存在内存中。
我的问题是关于闭包,
elapsedTime
是Timer
类中的一个属性.
你需要了解一些结论。elapsedTime
是闭包/匿名函数的参数。当计时器触发时,Timer
对象将其elapsedTime
属性传递给该匿名函数。如果您将它重命名为这样,则使用相同的方法:
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()
选择器函数的字符串名称呢?
是的,就像这样:
// 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编程,你可以跳过它。
https://stackoverflow.com/questions/30905096
复制相似问题