我正在写一段代码,我想计算一个按钮被按下的时间。为了做到这一点,我记录了一个NSDate()
当按钮被按下,并尝试使用timeIntervalSinceDate
函数当按钮被释放。这似乎工作,但我找不到任何方法来打印结果或切换为整数。
var timeAtPress = NSDate()
@IBAction func pressed(sender: AnyObject) {
println("pressed")
timeAtPress = NSDate()
}
@IBAction func released(sender: AnyObject) {
println("released")
var elapsedTime = NSDate.timeIntervalSinceDate(timeAtPress)
duration = ???
}
我见过一些类似的问题,但我不懂C,所以我很难理解给出的答案。如果有更有效的方法来找出按钮被按下了多久,我愿意接受建议。
7条答案
按热度按时间ryoqjall1#
您尝试计算的
elapsedTime
不正确。在Swift 3中,它将是:注意
Date
引用后面的()
,Date()
示例化一个新的日期对象,然后timeIntervalSince
返回该日期对象与timeAtPress
之间的时间差,这将返回一个浮点值(技术上是TimeInterval
)。如果您希望将其截断为
Int
值,只需用途:顺便说一句,您对
timeAtPress
变量的定义不需要示例化Date
对象。这将变量定义为
Date
变量(隐式解 Package 的变量),但您可能会将该变量的实际示例化推迟到调用pressed
之后。或者,我经常使用
CFAbsoluteTimeGetCurrent()
,例如,当我想设置
startTime
时,我执行以下操作:当我想计算经过的秒数时,我执行以下操作:
值得注意的是,
CFAbsoluteTimeGetCurrent
文档警告我们:重复调用此函数并不能保证结果单调递增。由于与外部时间参考同步或由于用户明确更改时钟,系统时间可能会缩短。
这意味着,如果您不幸在这些调整发生时测量了消耗时间,您可能会得到不正确的消耗时间计算结果。这对于
NSDate
/Date
计算也是如此。使用基于mach_absolute_time
的计算是最安全的(使用CACurrentMediaTime
最容易完成):以及
这使用了
mach_absolute_time
,但避免了Technical Q&A QA1398中概述的一些复杂性。不过,请记住,
CACurrentMediaTime
/mach_absolute_time
将在设备重启时重置。因此,底线是,如果你需要在应用运行时准确计算运行时间,请使用CACurrentMediaTime
。但如果你打算将此启动时间保存在永久存储中,以便在将来某个日期重启应用时调用。那么您必须使用Date
或CFAbsoluteTimeGetCurrent
,并忍受可能带来的任何不准确。sq1bmfud2#
雨燕5
nfzehxib3#
NSDate()和NSCalendar()听起来是个不错的选择。使用日历计算,把实际的数学部分留给框架。下面是一个快速获取两个
NSDate()
之间的秒数的示例nfs0ujit4#
根据Freddy的回答,这是swift 3中的函数:
lh80um4z5#
这就是你如何可以得到的最新版本的Swift 3的差异
参考:Getting the difference between two NSDates in (months/days/hours/minutes/seconds)
rryofs0p6#
雨燕5
6uxekuva7#
适用于“hh:mm”格式的2次之间的Swift 3秒
用途