27

What exactly is going on with DispatchTime.now()

How come I can't assign the time to wait as a variable?

And How Could I use a variable ?

Given error >>>

Binary operator '+' cannot be applied to operands of type 'DispatchTime' and 'Float'

var time : Float = 2.2 // <---time 

@IBAction func buttonPressed(_ sender: Any) {

    let when = DispatchTime.now() + 2.2 // <---- THIS IS OKAY
    DispatchQueue.main.asyncAfter(deadline: when){

        print("Hello")
    }

    let whenWhen = DispatchTime.now() + time // <---- THIS IS NOT OKAY
    DispatchQueue.main.asyncAfter(deadline: whenWhen){

        print("Hello")
    }
}
Dharmesh Kheni
  • 67,254
  • 32
  • 154
  • 160
Alex
  • 377
  • 1
  • 3
  • 7

3 Answers3

35

DispatchTime.now() is a double. You cannot add a float and a double value together. (A small explanation about why can't you add values with different types can be found here).

Replace

var time: Float = 2.2

with

var time: Double = 2.2

And it will work fine.

Tamás Sengel
  • 47,657
  • 24
  • 144
  • 178
Dharmesh Kheni
  • 67,254
  • 32
  • 154
  • 160
24

You can use DispatchTimeInterval to add time in DispatchTime.

For Example :

let whenWhen = DispatchTime.now() + DispatchTimeInterval.seconds(time)
DispatchQueue.main.asyncAfter(deadline: whenWhen){

    print("Hello")

}
Jayesh Thanki
  • 1,879
  • 2
  • 21
  • 29
  • There we gooooo Thanks Jayesh Thanki – Alex Dec 29 '17 at 10:50
  • let whenWhen = DispatchTime.now() + DispatchTimeInterval.milliseconds(Int(time*1000)) DispatchQueue.main.asyncAfter(deadline: whenWhen){ print("Hello") } – Alex Dec 29 '17 at 10:52
3

The error message pretty much explains it. You can't add a float and a DispatchTime together as they are different data types.

When you use this line:

let when = DispatchTime.now() + 2.2 // <---- THIS IS OKAY

you don't specify what type the 2.2 is and the system concludes it is of type DispatchTime and allows it.

However when you use this line:

let whenWhen = DispatchTime.now() + time // <---- THIS IS NOT OKAY

you have already determined that time is a float and that's where the error is generated.

It's probably easiest to convert like this:

DispatchTimeInterval.milliseconds(Int(time * 1000))
Upholder Of Truth
  • 4,350
  • 2
  • 10
  • 22