这是阅读项目30Days of Swift源码的仿写记录,该项目受到国外一个教程:Swift100天的启发。

Demo 1 StopWatch

第一个小demo是个秒表。功能简单就是点击Play计时。Pause暂停。Reset重置。

载入

设一个计数器counter初值0.0.然后用String()方法转成字符串传给Label。

Play

一个Timer对象。
点下Play时:

1
2
3
4
5
6
7
8

timer = Timer.scheduledTimer(
timeInterval: 0.1,
target: self,
selector: #selector(ViewController.UpdateTimer),
userInfo: nil,
repeats: true)

其中UpdateTimer方法是更新Label的。也就是每个时间间隔timeInterval: 0.1都会执行 counter+=1

运行测试。没问题。点击Play后。每0.1s时间标签会累加。
如果想更规范可以这么写String以控制数字显示格式:

1
timeLabel.text = String(format: "%.1f", counter)

Pause

只需要一个方法:
timer.invalidate()
timer对象停止计时。

而此时我们的秒表有了不跑两种状态。
我们新建一个Bool变量isPlaying。方便进行状态的检测。

isPlaying = True 时,
playBtn.isEnabled = falsePlay按钮失效
pauseBtn.isEnabled = truePause按钮有效。
FALSE时同理。

isPlaying作用

这时候已经发现小bug:多次点击Play按钮则会多次激活Timer计时器–》多次执行updateTimer方法–>时间增加变快。
解决方法:
在Play按钮的Action中增加一个判断:

1
2
3
if(isPlaying){
return
}

Reset

没什么特别的了。Counter置0.传到Label就ok。

思考

  • 关于状态isPlaying的控制极为重要。
  • 按钮的布局忘了怎么加限制了。不过暂时是小问题找个视频学学就好啦~

GitHub地址

https://github.com/ixsim/Swift30demos.git