it-swarm.com.ru

Неожиданно найдено ноль при развертывании необязательного значения

В моем приложении я проверяю, есть ли в сообщении изображение или нет.

Для этого я использую:

if pictures[string]? != nil {
    if var image: NSData? = pictures[string]? {
        imageView.image = UIImage(data: image!)
    }
}

Тем не менее, он все еще приходит с ошибкой:

фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения.

Я уверен, что это легко исправить, но я новичок в этом - что я делаю не так?

9
Ben Gray

Попробуйте сделать это так:

if let imageData = pictures[string] {
    if let image = UIImage(data: imageData) {
        imageView.image = image
    }
}

Предполагая, что string является действительным ключом.

Вы имеете дело с дополнительными функциями, поэтому перед использованием его условно разверните каждый возвращаемый объект.

Принудительное развертывание опасно и должно использоваться только тогда, когда вы абсолютно уверены, что необязательный параметр содержит значение. Возможно, ваши imageData имеют неправильный формат для создания изображения, но вы все равно принудительно развернули его. Это нормально делать в Objective-C, поскольку это просто означает, что объекты nil будут переданы. Свифт не так терпим.

14
Anorak

Это проблема Swift, когда вы забыли обернуть необязательные значения

Замените строку imageView.image = UIImage(data: image!) На imageView?.image = UIImage(data: image!)

1
iOS Developer

Я столкнулся с той же проблемой с этим кодом

if(!placeholderColor.isEqual(nil))
 {
   self.attributedPlaceholder = NSAttributedString(string: self.placeholder!, attributes: [NSForegroundColorAttributeName : placeholderColor])
 }

и решается этим

if let placeColor = placeholderColor
 {
   self.attributedPlaceholder = NSAttributedString(string: self.placeholder!, attributes: [NSForegroundColorAttributeName : placeColor])
 }
0
Varun Naharia

Сначала дважды проверьте формат строки base64. Моя строка имела следующий формат: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAZDElEQVR42u1daWATZRp+JkfT+76g90ELtKUX5wICshREgYKCKAiCC4iCu+Iq6q6CoKuLF4Igl6jLDaKgiJwiN5SjQAulpTe97zY90qRJ9sc, но перед запятой не требуется ничего. Я получил работающий код, изменив формат на:
iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAZDElEQVR42u1daWATZRp+JkfT+76g90ELtKUX5wICshREgYKCKAiCC4iCu+Iq6q6CoKuLF4Igl6jLDaKgiJwiN5SjQAulpTe97zY90qRJ9sc

0
anotherNoob