ios - 展开可选值时为零,但在打印期间该值存在

标签 ios swift uiimage tableview nsurl

当我想在 m 单元格中设置图片时,我的 TableViewController 出现了一个奇怪的情况。我的细胞类别是:

class TableViewCell

class TableViewCell: UITableViewCell {

/* OUTLETS */

@IBOutlet weak var pictureInRowOutlet: UIImageView!
@IBOutlet weak var postDataOutlet: UILabel!
@IBOutlet weak var titleOutlet: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization cod
} 

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state
}
}//end of class

class MyTableView

class MyTableView: UITableViewController{

var data:[[String:String]]? // data load from serwer    

//code we don't need

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell

// now I want to set up picture in row

let urlAdressPhoto = (data?[indexPath.item]["picture"])! 
// here, when I print urlAdressPhote I see correct value as String

cell.pictureInRowOutlet.image = UIImage(data: NSData(contentsOfURL: NSURL(string: urlAdressPhoto)!)!)
 // in this moment I recive an information about "unexpectedly found nil while unwrapping an Optional value". 

return cell

}

谁能告诉我为什么以及如何解决这个问题?

最佳答案

你强制打开至少 3 个不同的东西。在这一行中,

let urlAdressPhoto = (data?[indexPath.item]["picture"])! 

你强制解包 (data?[indexPath.item]["picture"]) 然后你就走运了。这不是 nil。您赌博并赢了。

也许被你的成功 Revel 了,你决定加倍努力......在这里,你在一个语句中强制解包两次:

UIImage(data: NSData(contentsOfURL: NSURL(string: urlAdressPhoto)!)!)

哇!这意味着如果 NSURL(string: urlAdressPhoto)nil,您的程序将崩溃。或者,如果它不是 nil,但对 NSData 的调用是 nil,那么您的程序将崩溃。

教训是,我不能经常说:为了方便起见,不要使用 !它会破坏您的代码。虽然偶尔有充分的理由使用它,但大多数人使用它是因为他们懒得打开包装。然后他们得到 unexpectedly found nil while unwrapping an Optional value

我敢说这是 Stack Overflow 上最常见的 Swift 相关问题。每天肯定有大约 10 个问题与该错误消息相关,这都是因为人们出于完全超出我理解的原因坚持使用 !

试试这个:

guard let urlAdressPhoto = (data?[indexPath.item]["picture"])
    , let url = NSURL(string: urlAdressPhoto)
    , let data = NSData(contentsOfURL: url) else { 
        print("Something failed to unwrap..."); return cell
    }

cell.pictureInRowOutlet.image = UImage(data: data)

关于ios - 展开可选值时为零,但在打印期间该值存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34728489/

相关文章:

ios - JSON 序列化从本地文件返回 null

ios - HTTP 请求 header

iOS - 从后台更新 UI

objective-c - 如何在 iPhone SDK 的 Objective-C 中合并两个 UIImage 对象

ios - UIImageView 在边框上拉伸(stretch)/重复图像并保持其质量

ios - 将一个项目插入集合中会重新加载 collectionView 中的每个项目

swift - 尾随闭包语法如何与 PublicSubject<Void>.subscribe 一起使用?

swift - 如何使用 PDFkit 检测滚动到 PDF 中的另一页

ios - UIAlertAction 值列表

swift - 为什么从 url 下载图像返回 nil?