обратный отсчет с использованием перехода NSDate на swift 3

#swift #swift2 #swift3

#swift #swift2 #swift3

Вопрос:

Сегодня я перешел на язык Swift 3. Я создаю приложение, которое дает обратный отсчет дней, часов, минут и секунд до события. Следующий код ниже отображает следующее в моем приложении:

Необязательно (6) дней, Необязательно (59) минут, необязательно (35) секунд.

Мой обратный отсчет в Swift 2 работал нормально, но как только я преобразовал его в Swift 3, перед цифрами появилось необязательное значение. Кто-нибудь с опытом работы в Swift 3 знает решение этой проблемы?

   @IBAction func NextWeeklyButtonPressed(_ sender: AnyObject) {
    let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(printTimeWeeks), userInfo: nil, repeats: true)
    timer.fire()        
   }

   func printTimeWeeks() {
    formatter.dateFormat = "MM/dd/yy hh:mm:ss a"
    let startTime = Date()
    let endTime = formatter.date(from: WeeklyDate.text! " 12:00:00 a")

    // WeeklyDate.text is a date in short style

    let timeDifference = (userCalendar as NSCalendar).components(requestedComponent, from: startTime, to: endTime!, options: [])

    WeeklyDateLabel.text = "(timeDifference.day) Days (timeDifference.minute) Minutes (timeDifference.second) Seconds"
}
  

Комментарии:

1. Это означает, что timeDifference.day это необязательно. Вы посмотрели ссылку на DateComponents для Swift 3?

Ответ №1:

добавить ! к полям

 WeeklyDateLabel.text = "(timeDifference.day!) Days (timeDifference.minute!) Minutes (timeDifference.second!) Seconds"
  

Комментарии:

1. Вероятно, не стоит принудительно разворачивать опции в этом случае (и вообще).

2. дни или месяц … никогда не быть нулевым . мы должны проверять nil для объектов, которые получают с сервера. день или месяц всегда имеют значение 😉

Ответ №2:

Вам нужно развернуть необязательные строки, например

 if let day = timeDifference.day, minute = timeDifference.minute, second = timeDifference.second {
  WeeklyDateLabel.text = "(timeDifference.day) Days (timeDifference.minute) Minutes (timeDifference.second) Seconds"
}