如何制作一个以 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.timeIntervalSinceReferenceDatestartTime: 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 转换为本地时间

将秒表“hh:mm:ss:ms”转换为存储在数据库中

将 yyyy-mm-dd-hh.mm.ss.ms 字符串转换为日期时间

java 调用 ffmpeg 进行视频截取

AIX 转换时间戳

如何使用批处理代码制作大字符串以在 python 中执行?