2015-04-22 7 views
6

Ich habe gesucht und bin von diesem Rätsel flummoxed.Problem mit Swift NSDate "timeIntervalSinceNow"

In Swift, Xcode 6.2, diese Linien arbeiten:

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

Aber die folgenden gibt einen Fehler zurück:

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

Console Ausgabe:

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

Was ist hier los? Warum die NSDate-Trickiness?

+0

Es ist nicht NSDate Trickiness. Es ist Swift Numerics Trickiness ... :( – matt

+1

Unabhängig von Ihrem Problem, aber nicht davon ausgehen, dass eines Tages 86400 Sekunden (Denken Sie an Sommerzeit Übergänge). Verwenden Sie besser NSCalendar Methoden für alle kalendarischen Berechnungen. –

Antwort

6

Es ist, weil timeIntervalSinceNow erwarten NSTimeInterval die Double ist.

Wenn Sie das tun:

let day_seconds = 86400 

DAY_SECOND ist Typ Int, die erwarten nicht, was das Verfahren ist. jedoch, wenn Sie die Nummer selbst:

let one_day_from_now = NSDate(timeIntervalSinceNow:86400) 

Compiler implizit, dass Sie doppelt sind vorbei, denn es ist das, was das Verfahren erwarten, was in Ordnung ist.

Die Lösung cancould NSTimeInterval(day_seconds) oder Double(day_seconds) verwenden, die gleich ist oder wenn Sie konstant erklären sicherstellen, dass es doppelt, zum Beispiel:

let day_seconds = 86400.0 

oder

let day_seconds: Double = 86400 

oder

let day_seconds: NSTimeInterval = 86400 
+0

Ausführlich, aber korrekt. :) – matt

+0

Danke, Greg, für die sehr klare Erklärung. Ich habe jetzt Verständnis für Swift-Numerik-Tricks. Ich entschuldige mich für die doppelte Frage, Matt! – drpecker26