2017-04-10 18 views
0

で働く - Xcodeのエラーを示しています、私はアプリを持っていると私は、実際のデバイス上でこのアプリを実行しようとした場合(iPhone 5Sと6)シミュレータ

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

あり問題のあるコードブロック。しかし、シミュレータではすべて正常で正しいです。

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? 

私は

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

を書くことができることを知っているが、私は、問題がどこにあるかお聞きしたいですか?

+0

'stringAfter'の値を表示し、その値が何であるかを確認してください。 'dd MMM yyyy'と一致してはいけません。 – rmaddy

+0

英語の平日と月の名前を持つ固定フォーマットを使用しているので、12/24時間形式の問題を回避したいので、フォーマッタのロケールを 'en_US_POSIX'に設定する必要があります。 – rmaddy

+0

ありがとう、それは働いている!!!! – spread7

答えて

0

あなたのコンバータが処理していない奇妙なタイムゾーンの問題である可能性があります。私はデバッグなしではわかりません。

かかわらず、私はむしろ文字列を解析しようとするよりも、あなたの日付を見つけるために、別たDateFormatterを使用することをお勧めします:

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 
} 

また、原則として、オプションをアンラップ強制(date!を)悪い考えでない限り、あなたは100%自信を持っています(この場合、フードの中で何が起こっているのか分からないのでできません)、あるいはその値が存在しない場合はプログラムがクラッシュしても問題ありません。

+0

最初のフォーマッタには 'hh'ではなく' hh'が必要です。そして、なぜ 'actualDate'と' 'let 'を持っているのですか? 'let realDate = startingFormatter ...'に結合します。 – rmaddy

+0

何ですか?文字列型のミス?私は0 :-)すべてのものが最初にあると思います。何が起こったのかをより良く示すために私はそれを打ちました。これが自分の生産コードだった場合、私はいくつかのことを別々にやります。 – PeejWeej

関連する問題