无法找到" +"接受提供的参数

时间:2015-02-19 13:31:06

标签: ios swift

看看这段代码:

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


    }

3 个答案:

答案 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)

UInt8NSTimeInterval是两种不同的类型。您需要使每个操作数都是相同的类型。 (或者您可以使用运算符重载。)