2015-04-22 7 views
6

Ho cercato in giro e sono sconcertato da questo indovinello.Problemi nell'usare Swift NSDate "timeIntervalSinceNow"

In Swift, Xcode 6.2, queste linee di lavoro:

let day_seconds = 86400 
let one_day_from_now = NSDate(timeIntervalSinceNow:86400) 

Ma il seguente restituisce un errore:

let day_seconds = 86400 
let one_day_from_now = NSDate(timeIntervalSinceNow:day_seconds) 

uscita della console:

"Playground execution failed: /var/folders/4n/88gryr0j2pn318sw_g_mgkgh0000gn/T/lldb/10688/playground625.swift:24:30: error: extra argument 'timeIntervalSinceNow' in call let one_day_from_now = NSDate(timeIntervalSinceNow:day_seconds)"

cosa sta succedendo qui? Perché l'inganno NSDate?

+0

Non è ingannevole NSDate. È un inganno dei numeri di Swift ... :( – matt

+1

Non correlato al tuo problema, ma non presumere che un giorno abbia 86400 secondi (pensa alle transizioni dell'ora legale) .Migliori metodi NSCalendar per tutti i calcoli di calendario –

risposta

6

È perché timeIntervalSinceNow si aspetta NSTimeInterval che è Double.

Se lo fai:

let day_seconds = 86400 

day_second è di tipo int, che non è quello che il metodo si aspettano. Tuttavia quando si digita il numero stesso:

let one_day_from_now = NSDate(timeIntervalSinceNow:86400) 

compilatore implicito che si sta passando doppio, perché è ciò che il metodo si aspetta, che è ok.

La soluzione cancould utilizzerà NSTimeInterval(day_seconds) o Double(day_seconds) che è lo stesso o quando si dichiara costante assicurarsi che sia doppio, ad esempio:

let day_seconds = 86400.0 

o

let day_seconds: Double = 86400 

o

let day_seconds: NSTimeInterval = 86400 
+0

Verbose ma corretto. :) – matt

+0

Grazie, Greg, per la spiegazione molto chiara. Ora ho una comprensione dell'inganno dei numeri di Swift. Mi scuso per la doppia domanda, Matt! – drpecker26