即使值不为nil也会发生nil崩溃

时间:2019-12-16 14:43:47

标签: swift firebase

我试图用数据填充集合视图,所以我正在做这样的事情:

cell.userImage.sd_setImage(with: URL(string: user[indexPath.row].imagePath))

cell.nameLabel.text = user[indexPath.row].username
cell.userID = user[indexPath.row].userID

所有这些都抛出错误,说该值是nil,但是我正在代码行之前打印这些值,而这些值也不是nil。

我用以下命令填充用户字典:

let userToShow = User()

if let username = value["username"] as! String?, let imagePath = value["urlToImage"] as! String? {

    userToShow.username = username
    userToShow.imagePath = imagePath
    userToShow.userID = uid
    self.user.append(userToShow)
    print(userToShow)
}

User类看起来像这样

class User: NSObject {

    var userID: String!
    var username: String!
    var imagePath: String!

}

我不太确定这些可选选项如何快速工作,因此也许我没有声明正确的方法。

2 个答案:

答案 0 :(得分:1)

有两个严重的问题都可能导致崩溃:

  1. 从不将类中的属性声明为隐式,未包装的可选属性,这是不编写初始化程序的不在场证明。可以使用初始化程序将其声明为非可选

    class User: NSObject {
    
        var userID: String
        var username: String
        var imagePath: String
    
        init(userID: String, username: String, imagePath: String) {
            self.userID = userID
            self.username = username
            self.imagePath = imagePath
        }
    }
    

    或作为常规可选

    class User: NSObject {  
        var userID: String?
        var username: String?
        var imagePath: String?
    }
    

    您真的需要一个类-甚至从NSObject继承吗?您真的需要var个元素吗?

  2. 强制将可选选项包装为可选(value["username"] as! String?)听起来不合逻辑,这是非常不好的做法。不要那样做正确的可选绑定语法是

    if let username = value["username"] as? String
    

请阅读《 Swift语言指南》中有关Optionals的部分

答案 1 :(得分:0)

在我的restorePosts()函数中,有一行显示了self.user.removeAll()。我想这是导致我去创建单元格时删除字典的原因。