Pourquoi créer Date de string a échoué seulement sur le vrai iphone?

J'utilise la fonction suivante pour créer Date from Ssortingng. Cela fonctionne bien sur le simulateur. Mais il s'est écrasé sur un vrai iPhone.

Ssortingng: "Tue May 23 23:19:41 +0800 2017" 

La première image est le debugging d'informations sur un vrai iPhone. Le second est le debugging des informations sur le simulateur. Débogage d'informations sur un vrai iPhone

Débogage d'informations sur un simulateur

 func createDate(fromSsortingng ssortingng: Ssortingng) -> Date { let formatter = DateFormatter() formatter.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy" let date = formatter.date(from: ssortingng) //fatal error: unexpectedly found nil while unwrapping an Optional value return date! } 

Je l'ai même essayé sur le terrain de jeu. C'est vraiment bizarre! Merci!

ce lien peut résoudre votre problème …..

Rapide

 formatter.locale = Locale(identifier: "en_US") 

Je parie que ça tombe sur la ligne suivante, pas sur la ligne que vous avez commentée. Vous forcez le déballage du résultat. Cette force-unwrap va planter avec l'erreur exacte que vous signalez si la conversion de date échoue.

J'appelle le ! l'opérateur "crash if nil". Tu ne devrais pas faire ça. Vous devez programmer de façon défensive et renvoyer l'option, puis écrire le code appelant pour gérer le cas où la conversion échoue.

D'autres ont déjà fait remarquer que les formateurs de date dépendent des parameters régionaux de l'appareil, et s'il est différent, votre conversion pourrait échouer. Forcer les parameters régionaux du formateur à un environnement local connu si vous souhaitez lui donner des strings littérales dont le format ne varie pas en fonction du pays et de la langue.

à partir des documents de l'application

Lorsque vous travaillez avec des dates au format fixe, telles que la RFC 3339, vous définissez la propriété dateFormat pour spécifier une string de format. Pour la plupart des formats fixes, vous devez également définir la propriété locale sur les parameters régionaux POSIX ("en_US_POSIX") et définir la propriété timeZone sur UTC.

RFC 3339

Dans macOS 10.12 et versions ultérieures ou iOS 10 et versions ultérieures, utilisez la class ISO8601DateFormatter lorsque vous travaillez avec des représentations de date ISO 8601.

wiki ISO 8601

Pour un format correct, utilisez la table des symboles de champ de date

le format de date est légèrement faux, veuillez utiliser l'exemple ci-dessous.

 let dateSsortingng : Ssortingng = "Tue May 23 23:19:41 +0800 2017" let dateFormatter = DateFormatter() dateFormatter.dateFormat = "EEE MMM dd HH:mm:ss ZZZ yyyy" dateFormatter.timeZone = TimeZone(identifier: "GMT") print(dateFormatter.date(from: dateSsortingng))