2017-07-19 13 views
0

JSONオブジェクトをRESTFUL APIで取得し、コアデータエンティティに挿入しています。Swift - Date From String Error

一つのそのような実体が予定され、ここに私のエンティティプロパティここ

extension Appointment { 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Appointment> { 
     return NSFetchRequest<Appointment>(entityName: "Appointment"); 
    } 

    @NSManaged public var date: Date? 
    @NSManaged public var id: Int32 
    @NSManaged public var message: String? 
    @NSManaged public var patient_name: String? 
    @NSManaged public var doctor: Doctor? 

} 

である私は、ここでエンティティに

for(_,jsonData):(String, JSON) in self.data["appointment"]["list"] { 
    // Construct appointment date 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" 
    let appointmentDate = dateFormatter.date(from: jsonData["date"].string!)! 
    print(appointmentDate) 

    // Preare appointment entity for inserting 
    let appointment = NSEntityDescription.insertNewObject(forEntityName: "Appointment", into: moc) 
    appointment.setValue(jsonData["id"].int32, forKey: "id") 
    appointment.setValue(appointmentDate, forKey: "date") 
    appointment.setValue(jsonData["message"].int32, forKey: "message") 
    appointment.setValue(jsonData["patient_name"].int32, forKey: "patient_name") 
    do { 
     try moc.save() 
    } catch { 
     fatalError("\(error)") 
    } 
} 

を挿入するために使用していたコードは、私がから取得、関連JSONされていますAPI

"appointment": { 
    "list": { 
     "id": 1, 
     "date": "2017-07-03 17:30", 
     "message": "Some message is usefule here", 
     "patient_name": "John Doe", 
     "doctor_id": 4 
    } 
} 

私がコードを実行すると、次のエラーが表示されます。

fatal error: unexpectedly found nil while unwrapping an Optional value

コードに問題がありますか?

ありがとうございました。

+0

を確認してくださいことその上で 'date()'を呼び出す前にdateFormatter' –

+0

ここで同じ問題があります:https://stackoverflow.com/questions/40692378/dateformatter-doesnt-return-date-for-hhmmss? –

+0

私は問題があなたのJSON応答の各jsonオブジェクトに日付があることを確認していますか? –

答えて

1

上記ラインにおけるクラッシュ

let appointmentDate = dateFormatter.date(from: jsonData["date"].string!)! 

の二つの可能性は、日付の値がヌルであるか、または別の形式は、次に使用される場合、それがクラッシュするあります

appointment.setValue(jsonData["message"].int32, forKey: "message") 

ここで、それはあなたの `にロケールを設定してみてくださいメッセージくる文字列としてクラッシュしていますが、そのまたpatient_nameための文字列と同じとして扱わ

をINT32と予定エンティティにするために変換されている更新コードの下に

for(_,jsonData):(String, [String: Any]) in self.data["appointment"]["list"] { 
      // Construct appointment date 
      let dateFormatter = DateFormatter() 
      dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" 
      var appointmentDate 
      if let date = jsonData["date"].string { 
       appointmentDate = dateFormatter.date(from: date) // possible crash may be date may be empty or or not given same date format which we used 
      } 
      print(appointmentDate) 

      // Preare appointment entity for inserting 
      let appointment = NSEntityDescription.insertNewObject(forEntityName: "Appointment", into: moc) 
      appointment.setValue(jsonData["id"].int32, forKey: "id") 
      appointment.setValue(appointmentDate, forKey: "date") 
      appointment.setValue(jsonData["message"], forKey: "message")// possible crash :: Here you are getting String converting to Int 
      appointment.setValue(jsonData["patient_name"].int32, forKey: "patient_name") 
      do { 
       try moc.save() 
      } catch { 
       fatalError("\(error)") 
      } 
     } 
1

試行は次のように変換する:与えられたコードで

open static func formatDateToString(_ date : Date) -> String { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm" 

    return dateFormatter.string(from: date) 
}