我对swift很新,我对swift甚至只是基本OOP有一些疑问(如果可以的话,请具体说明你的答案,非常感谢!)
所以我正在创建一个具有计时器组件的应用程序,并且以下代码片段来自该计时器类(和视图控制器):
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何时被调用,它的作用与stop函数有什么不同(在我看来它们都使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,这对我来说看起来像一个快速的功能?
答案 0 :(得分:1)
您的问题已加载。让我尝试一次解决一个问题:
为什么我需要在
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-C代码能够识别你的Swift函数。如果您只在Swift中编程,则可以跳过它。