看看这段代码:
var timepenalty = UInt8(0)
var currentTime = NSDate.timeIntervalSinceReferenceDate()
// Find the difference between current time and start time
var elapsedTime: NSTimeInterval = currentTime - startTime
let adjustedTime = UInt8(timepenalty + elapsedTime)
error-
"Could not find an overload for "+" that accepts the requested arguments.
"
这是为每次玩家犯错误时为秒表式计时器增加时间的游戏。当我只使用整数而不是elapsedTime变量时代码可以工作:
let adjustedTime = UInt8(elapsedTime + 5)
但用变量替换5会产生错误。
以下是updateTime
功能的完整代码:
func updateTime() {
var currentTime = NSDate.timeIntervalSinceReferenceDate()
// Find the difference between current time and start time
var elapsedTime: NSTimeInterval = currentTime - startTime
let adjustedTime = UInt8(timepenalty + elapsedTime)
// calculate the minutes in elapsed time
let minutes = UInt8(elapsedTime / 60.0)
elapsedTime -= (NSTimeInterval(minutes) * 60)
// calculate the seconds in elapsed time
seconds = UInt8(elapsedTime)
elapsedTime -= NSTimeInterval(seconds)
// seconds += timepenalty
// find out the fraction of millisends to be displayed
let fraction = UInt8(elapsedTime * 100)
// if seconds > 20 {
// exceedMsgLabel.text = "超过20秒了"
// }
// add the leading zero for minutes, seconds and millseconds and store them as string constants
let startMinutes = minutes > 9 ? String(minutes):"0" + String(minutes)
let startSeconds = seconds > 9 ? String(seconds):"0" + String(seconds)
let startFraction = fraction > 9 ? String(fraction):"0" + String(fraction)
displayTimeLabel.text = "\(startMinutes):\(startSeconds):\(startFraction)"
var penalty = String(timepenalty)
penaltylabel.text = "+ " + penalty
}
答案 0 :(得分:2)
@David的代码很好,但我强烈建议你让adjustedTime
成为NSTimeInterval
。这是一个时间间隔,这是什么类型的。那么你所有的铸造问题都会消失。
UInt8
类型保留用于明确需要8位位模式的情况(如网络协议或二进制文件格式)。它并不适用于小数字。"在有符号和无符号数字之间移动以及不同大小的数字是常见的错误来源,并且故意使其变得麻烦。
如果您确实需要强制Double
为整数,请在大多数情况下使用Int
而不是UInt8
。在大多数情况下,无论如何,看起来你真的是floor()
而不是Int()
。你只是将整数归一化。
也就是说,更典型的格式化方法是:
import Foundation
let totalSeconds: NSTimeInterval = 100.51
let frac = Int((totalSeconds - floor(totalSeconds)) * 100)
let seconds = Int(totalSeconds % 60)
let minutes = Int((totalSeconds / 60) % 60)
let result = String(format: "%02d:%02d:%02d", minutes, seconds, frac)
答案 1 :(得分:1)
这一行:
let adjustedTime = UInt8(timepenalty + elapsedTime)
尝试添加UInt8
(时间惩罚)和NSTimeInterval
(double,elapsedTime)失败,因为Swift中没有隐式类型转换。将其更改为:
let adjustedTime = timepenalty + UInt8(elapsedTime)
在添加之前将NSTimeInterval
转换为UInt8。
答案 2 :(得分:0)
UInt8
和NSTimeInterval
是两种不同的类型。您需要使每个操作数都是相同的类型。 (或者您可以使用运算符重载。)