web-dev-qa-db-fra.com

Inopinément trouvé nul lors du déroulement de la valeur optionnelle

Dans mon application, je vérifie si un message a une image ou non.

Pour cela j'utilise:

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

Cependant, l'erreur est toujours la suivante:

erreur fatale: trouvé de manière inattendue nil lors du déroulement d'une valeur facultative.

Je suis sûr que c'est quelque chose de facile à réparer, mais je suis assez novice dans ce domaine.

9
Ben Gray

Essayez de le faire de cette façon:

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

En supposant que string est une clé valide.

Vous avez affaire à des options, vous devez donc conditionner conditionnellement chaque objet de retour avant de l'utiliser.

Le déballage forcé est dangereux et ne doit être utilisé que si vous êtes absolument sûr qu'un option contient une valeur. Le format de votre imageData peut ne pas être correct pour créer une image, mais vous forcez néanmoins le dérouler de force. Cela convient à Objective-C car cela signifie simplement que les objets nil sont transmis. Swift n'est pas si tolérant.

14
Anorak

C’est le problème de Swift quand vous oubliez d’emballer des valeurs optionnelles

Remplacez la ligne imageView.image = UIImage(data: image!) Par imageView?.image = UIImage(data: image!)

1
iOS Developer

J'ai rencontré le même problème avec ce code

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

et résolu par cela

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

Vérifiez d'abord le format de la chaîne base64. Ma chaîne avait le format suivant: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAZDElEQVR42u1daWATZRp+JkfT+76g90ELtKUX5wICshREgYKCKAiCC4iCu+Iq6q6CoKuLF4Igl6jLDaKgiJwiN5SjQAulpTe97zY90qRJ9sc mais il n’est pas nécessaire de faire une virgule avant la virgule. J'ai obtenu le code en changeant le format en:
iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAZDElEQVR42u1daWATZRp+JkfT+76g90ELtKUX5wICshREgYKCKAiCC4iCu+Iq6q6CoKuLF4Igl6jLDaKgiJwiN5SjQAulpTe97zY90qRJ9sc

0
anotherNoob