2017-04-10 1 views
0

ich eine App haben, und wenn ich versuche, diese App auf realen Geräten (iPhone 5S und 6) zu laufen - Xcode zeigt Fehler:kann nicht ein Datum für reales Gerät analysieren, arbeitet im Simulator

fatal error: unexpectedly found nil while unwrapping an Optional value 2017-04-11 00:43:58.724143+0200 APN[2153:475883] fatal error: unexpectedly found nil while unwrapping an Optional value

Es gibt ein Block von Code, wo ist ein Problem. Aber im Simulator ist alles in Ordnung und korrekt.

let stringBefore = "Mon, 10 Apr 2017 11:39:24 +0000" 

let startIndexDate = stringBefore.index(stringBefore.startIndex, offsetBy: 5) 
let endIndexDate = stringBefore.index(stringBefore.endIndex, offsetBy: -15) 

let rangeDate = startIndexDate..<endIndexDate 
let stringAfter = stringBefore.substring(with: rangeDate) 

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "dd MMM yyyy" 

let date = dateFormatter.date(from: stringAfter) 
dateFormatter.dateFormat = "dd.MM.yyyy" 

let finish = dateFormatter.string(from: date!) // there is the problem but why in Simulator is ok? 

Ich weiß, dass ich

dateFormat = "EEE, dd MMM yyyy hh:mm:ss +zzzz" 

schreiben kann, aber ich möchte Sie fragen, wo ist das Problem?

+0

Den Wert von 'stringAfter' drucken und sehen, was sein Wert ist. Es darf nicht mit 'dd MMM yyyy' übereinstimmen. – rmaddy

+0

Und Sie müssen das Gebietsschema des Formatierers auf 'en_US_POSIX' setzen, da Sie ein festes Format mit englischen Wochentag- und Monatsnamen verwenden und Sie das unangenehme 12/24-Stundenformat vermeiden möchten. – rmaddy

+0

Danke, es funktioniert !!!! – spread7

Antwort

0

Es ist möglich, dass es ein seltsames Zeitzonenproblem ist, das der Konverter nicht verarbeitet. Ich kann es nicht ohne Debugging wissen.

Egal, würde ich mit einem anderen DateFormatter empfehlen Ihr Datum zu finden, anstatt zu versuchen, die Zeichenfolge zu analysieren:

let startingFormatter = DateFormatter() 
startingFormatter.dateFormat = "EEE, dd MMM y HH:mm:ss Z" 

let endingFormatter = DateFormatter() 
endingFormatter.dateFormat = "dd.MM.yyyy" 

let stringBefore = "Mon, 10 Apr 2017 11:39:24 +0000" 
let actualDate = startingFormatter.date(from: stringBefore) 

if let actualDate = actualDate { 
    let finish = endingFormatter.string(from: actualDate) //result is "10.04.2017" 
} 
else { 
    //handle error 
} 

Auch als allgemeine Regel, Kraft Abwickeln eine optionale (date!) ist eine schlechte Idee, es sei denn, Sie sind 100% sicher, dass es einen Wert gibt (was Sie in diesem Fall nicht sein können, weil Sie nicht wissen, was unter der Haube passiert), oder ob Ihr Programm abstürzt, wenn dieser Wert nicht existiert.

+0

Sie brauchen 'HH', nicht' hh' im ersten Formatierer. Und warum haben "actualDate" und dann "if let"? Kombiniere zu einem: 'wenn actualDate = startingFormatter ...'. – rmaddy

+0

Was? Ein Fehler auf etwas Stringig getippt? Ich denke, es gibt ein erstes für alles 0 :-)/s Ich brach es aus, um besser zu zeigen, was passierte. Wenn das Produktionscode für mich wäre, würde ich ein paar Dinge anders machen. – PeejWeej

Verwandte Themen