Swift — компилятор предупреждает, что я не развернул необязательный элемент, но затем заставляет меня развернуть его, используя ! скорее, чем?

У меня есть ошибка в моем коде, когда компилятор выдает предупреждение о необходимости развернуть необязательное сообщение

Значение необязательного типа 'NSDate?' не развернутый; Вы хотели использовать '!' или '?'?

Мой код

    let formatter = NSDateFormatter()
    let dob = currUser.valueForKey(userTextFieldKeyNames[i]) as? NSDate
    let dobText = formatter.stringFromDate(dob) //compiler says i need to unwrap dob using ! or ? ... but why am i forced to use ! rather than ? here
    field.text = dobText

Я хочу использовать? развернуть dob, чтобы присваивание dobText не выполнялось, если dob равен нулю. Сообщение компилятора указывает, что я могу использовать ! или ? но это только счастливо, если я использую доб! развернуть. Если я попытаюсь использовать доб? компилятор жалуется и заставляет меня использовать !.

Если я заставлю unwrap dob, и он будет нулевым, не вызовет ли это сбой в строке formatter.stringFromDate(dob!) . Может кто-нибудь объяснить, что здесь происходит и как правильно это сделать


person lozflan    schedule 03.06.2015    source источник


Ответы (1)


formatter.stringFromDate(someDate) принимает NSDate в качестве параметра, а не необязательный NSDate (NSDate?). Поэтому вам нужно либо небезопасно принудительно развернуть его, используя as!, либо безопасно развернуть его, используя if let или оператор объединения nil (??).

person Ian    schedule 03.06.2015
comment
спасибо. так что решающим является тот факт, что метод stringFromDate принимает NSDate, а не необязательный NSDate? Я пытался применить шаблон в книге Мэтта Нойбурга по понижению и отправить сообщение в необязательный, при необходимости развернув необязательный, т.е. пусть myDate: AnyObject = NSDate() (myDate as? NSDate)?.description ..... это работает ...... но разница, похоже, в том, что в моем исходном вопросе dob был (необязательным) параметром в методе stringFromDate - person lozflan; 11.06.2015
comment
Да, это основная причина, почему это не сработало. Лично я бы предпочел, чтобы функция принимала необязательную дату, которая, если бы она была нулевой, просто возвращала бы необязательную строку с нулевым значением, но, к сожалению, это не так. - person Ian; 11.06.2015