【问题标题】:Unexpectedly found nil while unwrapping optional value [duplicate]在展开可选值时意外发现 nil [重复]
【发布时间】:2014-12-27 19:43:27
【问题描述】:
在我的应用中,我正在检查帖子是否有图片。
为此我正在使用:
if pictures[string]? != nil {
if var image: NSData? = pictures[string]? {
imageView.image = UIImage(data: image!)
}
}
但是还是报错:
致命错误:在展开 Optional 值时意外发现 nil。
我确信这很容易解决,但我对此很陌生 - 我做错了什么?
【问题讨论】:
标签:
ios
iphone
xcode
swift
【解决方案1】:
尝试这样做:
if let imageData = pictures[string] {
if let image = UIImage(data: imageData) {
imageView.image = image
}
}
假设string 是一个有效的密钥。
您正在处理可选项,因此在使用之前有条件地解开每个返回对象。
强制展开是危险的,只有在您绝对确定可选包含值时才应使用。您的 imageData 可能不是创建图像的正确格式,但无论如何您都在强行打开它。这在 Objective-C 中是可以做的,因为它只是意味着 nil 对象被传递。 Swift 就没有那么宽容了。
【解决方案2】:
当您忘记包装可选值时,这是 swift 的问题
替换行imageView.image = UIImage(data: image!)
imageView?.image = UIImage(data: image!)
【解决方案3】:
这段代码我也遇到了同样的问题
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])
}
【解决方案4】:
首先仔细检查 base64 字符串的格式。我的字符串具有以下格式:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAZDElEQVR42u1daWATZRp+JkfT+76g90ELtKUX5wICshREgYKCKAiCC4iCu+Iq6q6CoKuLF4Igl6jLDaKgiJwiN5SjQAulpTe97zY90qRJ9sc 但不需要逗号之前的所有内容。我通过将格式更改为:
iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAZDElEQVR42u1daWATZRp+JkfT+76g90ELtKUX5wICshREgYKCKAiCC4iCu+Iq6q6CoKuLF4Igl6jLDaKgiJwiN5SjQAulpTe97zY90qRJ9sc
使代码正常工作