2017-05-04 10 views
0

JSON解析がSIGABRTエラーの原因となる理由がわかりません。プレイグラウンド実行エラー:JSON文字列の解析中にSIGABRTシグナルが発生する

class Bug { 
    enum State { 
     case open 
     case closed 
    } 

    let state: State 
    let timestamp: Date 
    let comment: String 

    init(state: State, timestamp: Date, comment: String) { 
     self.state = state 
     self.timestamp = timestamp 
     self.comment = comment 
    } 

    init(jsonString: String) throws { 

     let dict = convertToDictionary(from: jsonString) 

は、私は、これはエラーの原因となっているものだと思うが、私は理由を把握できませんでした:

func convertToDictionary(from text: String) -> [String: Any] { 
    guard let data = text.data(using: .utf8) else { return [:] } 
    let anyResult: Any? = try? JSONSerialization.jsonObject(with: data, options: []) 
    return anyResult as? [String: Any] ?? [:] 
} 

enum TimeRange { 
    case pastDay 
    case pastWeek 
    case pastMonth 
} 

エラー画像:enter image description here

 self.state = dict["state"] as! Bug.State 

     self.comment = dict["comment"] as! String 

     self.timestamp = dict["timestamp"] as! Date 
    } 
} 

JSON文字列辞書に

答えて

2

この行は問題と思われる:

self.state = dict["state"] as! Bug.State

Bug.Stateenumのカスタムタイプです。しかしdict["state"]の値はStringです。 as!を使用することによって、あなたは、実行時にBug.Stateなりますを知ってが、アプリは、それはそれはそれは、ないBug.Stateある文字列をスローしていることを知り実行中にシステムが見えたときに、コンパイラを語っています例外。

同様に、変換しようとしているタイムスタンプを設定する行に、ストリング型のキャストを使用している文字列が日付に変換されます。その値を文字列に変換するために、NSDateFormatterを使用して文字列から日付を抽出する必要があります。

+0

これを解決するには、私はどのような変更を加える必要があると思いますか? –

+0

私は、文字列を受け取り、適切に作成されたenum値を返すコンストラクタをenumに追加します。次に、あなたは 'self.state = Bug.State(fromString:dict [" state "])' –

+0

のようなものを呼び出すことができました。 3つのself.xxxステートメントはすべてこのエラーを引き起こします。 –

関連する問題