如何制作一个以 hh:mm:ss:ms 计算的 Swift 3.0 计时器
Posted
技术标签:
【中文标题】如何制作一个以 hh:mm:ss:ms 计算的 Swift 3.0 计时器【英文标题】:How can I make a Swift 3.0 timer that calculates in hh:mm:ss:ms 【发布时间】:2016-11-11 14:48:51 【问题描述】:我在Swift timer in milliseconds 中遵循了 DuncanC 的解决方案。代码如下:
startTime = NSDate.timeIntervalSinceReferenceDate
Timer.scheduledTimer(timeInterval: 0.02,
target: self,
selector: Selector(("advanceTimer:")),
userInfo: nil,
repeats: true)
func advanceTimer(timer: Timer)
//Total time since timer started, in seconds
self.time = NSDate.timeIntervalSinceReferenceDate - startTime
//The rest of your code goes here
Xcode 建议我将 Swift 3.0 的 NSDate.timeIntervalSinceReferenceDate()
更改为 NSDate.timeIntervalSinceReferenceDate
和 startTime: NSTimeInterval
更改为 startTime: TimeInterval
。
我的代码产生了错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[MyGame.GameScene advanceTimer:]:无法识别的选择器已发送到实例
【问题讨论】:
你为什么用NSDate
而不是Date
?
感谢您的更正。我设法从***.com/questions/28872450/… 获取格式
【参考方案1】:
在 Swift 3 中 Selector
语法已更改,现在您需要在操作中传递第一个参数标签,您的 selector
应该类似于 #selector(self.advanceTimer(timer:))
。
Timer.scheduledTimer(timeInterval: 0.02,
target: self,
selector: #selector(self.advanceTimer(timer:)),
userInfo: nil,
repeats: true)
【讨论】:
您已多次发布类似的答案。你真的应该把这些问题作为重复来结束。 @rmaddy 下次我一定会举旗。:)【参考方案2】:advanceTimer(timer:)
应该根据 Swift API Design Guidelines 以不同的方式声明,您应该使用 Swift 的原生 Date
而不是 NSDate
,并且选择器语法已更改,因此您的代码现在可以这样编写:
startTime = NSDate.timeIntervalSinceReferenceDate
Timer.scheduledTimer(timeInterval: 0.02,
target: self,
selector: #selector(advanceTimer),
userInfo: nil,
repeats: true)
func advanceTimer(_ timer: Timer)
//Total time since timer started, in seconds
self.time = NSDate.timeIntervalSinceReferenceDate - startTime
//The rest of your code goes here
另外,Timer
有新的基于闭包的方法,所以你的整个事情现在可以简化为:
startTime = NSDate.timeIntervalSinceReferenceDate
Timer.scheduledTimer(withTimeInterval: 0.02, repeats: true) timer in
//Total time since timer started, in seconds
self.time = NSDate.timeIntervalSinceReferenceDate - startTime
//The rest of your code goes here
【讨论】:
+1 用于新的基于闭包的计时器。我希望 Apple 在他们第一次引入块时在 ios 4 中添加了这一点。不知道为什么花了这么长时间。直到几天前我才发现这个添加。 (请注意,如果您的应用需要在 iOS 10 之前的 iOS 版本上运行,那么您不能使用基于闭包的计时器。:(以上是关于如何制作一个以 hh:mm:ss:ms 计算的 Swift 3.0 计时器的主要内容,如果未能解决你的问题,请参考以下文章
使用 JavaScript 将 (YYYY/MM/DD HH:MM:SS.MS) GMT 转换为本地时间