Michael Rize
Michael Rize

Reputation: 107

Could not find an overload for "+" that accepts the supplied arguments

Look at this code:

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.
"

This is for a game that adds time to the stopwatch-style timer, every time the player makes a mistake. The code works when I just use an integer instead of the elapsedTime variable as so:

let adjustedTime = UInt8(elapsedTime + 5) 

but replacing 5 with a variable gives an error.

Here's the full code for the updateTime function:

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


    }

Upvotes: 0

Views: 499

Answers (3)

Rob Napier
Rob Napier

Reputation: 299355

@David's code is good, but I'd strongly recommend that you make adjustedTime be an NSTimeInterval. It is a time interval, and that's what the type is for. Then all your casting issues go away.

The UInt8 type is reserved for cases where you explicitly need an 8-bit bit-pattern (like for networking protocols or binary file formats). It isn't intended for "small numbers." Moving between signed and unsigned numbers and different sized-numbers are common sources of bugs, and is intentionally made cumbersome.

If you do need to force a Double to be a whole number, just use Int rather than UInt8 in most cases. In most of these cases it looks like you really mean floor() rather than Int() anyway. You're just normalizing to an whole number.

That said, a more typical way to do your formatting is:

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)

Upvotes: 2

David Berry
David Berry

Reputation: 41226

This line:

let adjustedTime = UInt8(timepenalty + elapsedTime)

is attempting to add a UInt8 (time penalty) and an NSTimeInterval (double, elapsedTime) which fails as there is no implicit type conversion in Swift. Change it to:

let adjustedTime = timepenalty + UInt8(elapsedTime)

Which converts the NSTimeInterval to a UInt8 before the addition.

Upvotes: 1

Aaron Brager
Aaron Brager

Reputation: 66262

UInt8 and NSTimeInterval are two different types. You need to make each operand the same type. (Or you could use operator overloading.)

Upvotes: 0

Related Questions