Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 致命错误:在展开可选值时发现意外的nil_Arrays_Model View Controller_Swift3 - Fatal编程技术网

Arrays 致命错误:在展开可选值时发现意外的nil

Arrays 致命错误:在展开可选值时发现意外的nil,arrays,model-view-controller,swift3,Arrays,Model View Controller,Swift3,我的数据数组有问题,在此数据数组中,我发送了6个图像的名称,以便稍后将它们加载到CollectionView中,这6个图像加载良好,没有任何问题,但当我添加字符串值以发送时,它会给我一个空错误: 这是我的类,其中是我的数据数组: import UIKit class HBook{ var imagenB: UIImage! var estatus: String! init(estatus: String, imagenB: UIImage) {

我的数据数组有问题,在此数据数组中,我发送了6个图像的名称,以便稍后将它们加载到CollectionView中,这6个图像加载良好,没有任何问题,但当我添加字符串值以发送时,它会给我一个空错误:

这是我的类,其中是我的数据数组:

 import UIKit

class HBook{
    var imagenB: UIImage!
    var estatus: String!

    init(estatus: String, imagenB: UIImage) {

        self.estatus = estatus
        self.imagenB = imagenB
    }

    class func getData() -> [HBook]{

        let rawData = [
            ["imagenB":"book1"],
            ["imagenB":"book2"],
            ["imagenB":"book3"],
            ["imagenB":"book4"],
            ["imagenB":"book5"],
            ["imagenB":"book6"],
            ["estatus":"No reservado"]
        ]

        var hbook:[HBook] = []

        for item in rawData{
            hbook.append(HBook(estatus: item["estatus"]!, imagenB: UIImage(named: item["imagenB"]!)!))   
        }
        return hbook
    }
}
我打印数据数组以查看哪个变量为空,但显然所有变量都有一个赋值:

我不知道为什么要发送空值

此信息是在另一个具有CollectionView和标签的类中检索的,我传递信息的方法位于cellForItemAt方法中:

class DetailViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var contenedorCollection: UIView!
    @IBOutlet weak var myCollection: UICollectionView!
    @IBOutlet weak var pages: UIPageControl!
    @IBOutlet weak var estatus: UILabel!

    var hbook = HBook.getData()
    var nombreH = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        pages.numberOfPages = hbook.count
        self.title = nombreH

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return hbook.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CellCollectionViewCell

        cell.imageview.image = hbook[indexPath.row].imagenB
        estatus.text = hbook[indexPath.row].estatus
        return cell
    }

我认为问题在于数据类。请用以下代码替换您的HBook类,它将正常工作,无需进一步更改:

class HBook{
var imagenB: UIImage?
var estatus: String?

init(estatus: String? = nil, imagenB: UIImage? = nil) {

    self.estatus = estatus
    self.imagenB = imagenB
}

class func getData() -> [HBook]{

    let rawData = [
        ["imagenB":"book1","estatus":"No reservado"],
        ["imagenB":"book2","estatus":"No reservado"],
        ["imagenB":"book3","estatus":"No reservado"],
        ["imagenB":"book4","estatus":"No reservado"],
        ["imagenB":"book5","estatus":"No reservado"],
        ["imagenB":"book6","estatus":"No reservado"]
    ]

    var hbook:[HBook] = []

    for item in rawData{
        if let image = item["itemnB"]{
            hbook.append(HBook(estatus: item["estatus"], imagenB:UIImage(named:image)))
        }else{
            hbook.append(HBook(estatus: item["estatus"]))
        }
    }
    return hbook
}

}

为什么要将estatus.text=hbook[indexPath.row].cellForItem方法中的estatus设置为estatus标签不属于集合的一部分view@Enrique为什么要把它完全拆开??我会永远给你崩溃。尝试使用“if let”或guard语句来展开是的,你是对的,你的解决方案帮助我解决了问题,但我有一个问题,有没有办法避免在每个值中添加状态​​修复方案是什么?我的意思是:[“imagenb”:[“book1”、“book2”、“book3”、“book4”、“book5”],[“estatus”:“No reservado”]@Enrique:为了做到这一点,你需要用一个字典来代替数组,其中数组代表键“imagenb”,字符串代表键“estatus”。