Строковые расширения toDate () приводят к падению некоторых устройств - PullRequest
0 голосов
/ 06 ноября 2019

Моя проблема - попытаться преобразовать строку в дату и привести к сбою. Мое приложение находится в App Store и работает на моем устройстве, но на некоторых устройствах происходит сбой. Я посмотрел журнал сбоев и вижу, что происходит сбой при поступлении строки на дату. Я не понимаю, почему мое устройство работает или некоторые устройства работают хорошо, но другие - сбой.

func toDate() -> Date {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+03:00" //Your date format
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") //Current time zone
    //according to date format your date string
    guard let date = dateFormatter.date(from: self) else {
        fatalError()
    }
    return date
}

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Два решения:

  1. Добавление en_US_POSIX локали для фиксированного формата.
  2. Использование ISO8601DateFormatter (iOS 8+), преимущество не в локали,нет формата даты, нет часового пояса.

    func toDate() -> Date? {
        let dateFormatter = ISO8601DateFormatter()
        return dateFormatter.date(from: self) 
    }
    

В любом случае возвращайте необязательное значение, fatalError() в производственной среде вызывает довольно плохой пользовательский опыт.

0 голосов
/ 06 ноября 2019

Вы будете аварийно завершать работу, потому что всякий раз, когда вы пытаетесь выполнить этот метод для строки, которая не является датой в указанном формате строки, dateFormatter будет возвращать nil, а затем ваш оператор guard будет вызывать fatalerror ()

Просто верните выходные данные dateformatter и обработайте необязательный на сайте вызова.

func toDate() -> Date? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss+03:00" 
    dateFormatter.timeZone = TimeZone(abbreviation: "GMT+3:00") 
    return dateFormatter.date(from: self) 
}

Возможно, вы захотите использовать только текущий часовой пояс по умолчанию, а не указывать его?

...