неожиданно обнаружил ноль при разворачивании Необязательного значения НЕПРЕРЫВНАЯ проверка

У меня есть следующий код swift 3 в проекте xcode 8:

if pictureImg.image == nil {
  print("image nil")
}

if pictureImg.image != nil {
  print("image not nil")
}

if pictureImg.image != nil {
  imageData = UIImageJPEGRepresentation(pictureImg.image!, 0.5)!
}

Во время выполнения я получаю в консоли странный результат:

image not nil
fatal error: unexpectedly found nil while unwrapping an Optional value

Итак, похоже, что мой pictureImg.image на самом деле равен нулю несмотря на мой предыдущий идентичный оператор if, говорящий об обратном. Проверяет, является ли UIImageJPEGRepresentation нулевым, также приводит к той же ошибке:

if UIImageJPEGRepresentation(pictureImg.img!, 0.5) == nil { *code* }

подтверждение того, что проблема определенно связана с pictureImg.image, по крайней мере, так кажется.

Есть ли немедленная / очевидная проблема с этим кодом или нужно будет сообщить больше информации о проекте?


person Legatro    schedule 31.01.2017    source источник
comment
Вы проверяете, возвращается ли UIImageJPEGRepresentation nil? Вы принудительно разворачиваете возвращаемое значение. Также вы должны использовать операторы if let вместо проверки nil.   -  person JAL    schedule 01.02.2017
comment
Никогда, никогда не используйте! Разворачивать необязательный грех Swift. Есть так много хороших способов сделать это. Это подход «разбей это с большими вещами».   -  person Fogmeister    schedule 01.02.2017
comment
@Fogmeister, необязательный грех Свифт!?! Вот это забавная опечатка!   -  person Duncan C    schedule 01.02.2017


Ответы (1)


Я полагаю, UIImageJPEGRepresentation(pictureImg.image!, 0.5)! возвращает ноль. Проверьте документацию Apple. https://developer.apple.com/reference/uikit/1624115-uiimagejpegpresentation

Сделайте что-нибудь вроде этого:

if let image = pictureImg.image {
   if let imageRepresentation = UIImageJPEGRepresentation(image, 0.5) {
     ...
   }
}

Таким образом, у вас не будет никаких проблем.

Или вы можете связать их, как предложено @Emptyless

if let image = pictureImg.image, let imageRepresentation = UIImageJPEGRepresentation(image, 0.5) {
     ...
}
person alecnash    schedule 31.01.2017
comment
Пожалуйста, проголосуйте, чтобы закрыть вопрос как дубликат, тогда: UIImageJPEGRepresentation возвращает ноль - person JAL; 01.02.2017
comment
Вы можете связать их в 1 оператор if let. Если вас интересует только эта конкретная комбинация, я думаю, она выглядит более изящной. - person Emptyless; 01.02.2017
comment
Работает как шарм! Прошу прощения за этот вопрос, если это глупо, я новичок в этой игре, и я очень благодарен вам, ребята, что вы можете помочь нам, идиотам! - person Legatro; 01.02.2017