ios - 如何在不允许可选值的情况下使用 Firebase

标签 ios swift firebase firebase-realtime-database optional-parameters

我是 iOS 开发的新手,我知道在初始化对象时允许可选值不是“好公民”技术。话虽如此,我读到过始终设置值是一种很好的做法,如下所示:

class Item{
    var name: String
    var color: String
    init(name: String, color: String) {
        self.name = name
        self.color = color
    }
}

这看起来很整洁,但是我怎样才能使用 Firebase 做类似的事情呢?看看我到目前为止得到了什么:

private func loadPosts(){
    databaseHandle = ref.child("users/\(self.user.uid)/posts").observe(.value, with:{(snapshot) in
        var newPosts = [Post]()

        for itemSnapShot in snapshot.children {
            let post = Post(snapshot: itemSnapShot as! FIRDataSnapshot)
            newPosts.append(post!)
        }
        self.posts = newPosts
        self.tableView.reloadData()
    })
}

这个人被放置在我的 PostsViewController 中,我有我的 TableView 。这是我的模型:

class Post {
    var ref: FIRDatabaseReference?
    var title: String?
    var answer: String?
    var contentUrl: String?
    var photoUrl: String?
    var createdAt: String?
    var feeling: String?
    var kind: String?
    var text: String?
    var uid: String?
    var measurements: Dictionary<String, String>?

    //MARK: Initialization
    init?(snapshot: FIRDataSnapshot){
        ref = snapshot.ref

        let data = snapshot.value as! Dictionary<String, Any>

        title = data["title"]! as? String
        answer = data["answer"] as? String
        contentUrl = data["content_url"] as? String
        photoUrl = data["photo_url"] as? String
        createdAt = data["created_at"] as? String
        feeling = data["feeling"] as? String
        kind = data["kind"] as? String
        text = data["text"] as? String
        uid = data["uid"] as? String
        measurements = data["measurements"] as? Dictionary<String, String>
    }
}

我不知道确切的原因,但这些问号感觉不太对,我时不时会遇到一些 nil 指针错误,我认为我应该能够通过使用“好公民”技术来避免这种情况。

那么,有人知道如何按照 Swift 最佳实践使用 Firebase 吗?

最佳答案

要么你希望你的 Post 类的属性为 nil,要么你不想。

如果你这样做了,那很好。您发布的代码允许其中任何一个为零。您只需在每次需要时安全地访问每个属性。

如果您不这样做,则不要将它们设为可选。然后在您的 init 中,如果快照中没有值,您需要通过为每个属性提供默认值来确保没有任何属性设置为 nil

class Post {
    var ref: FIRDatabaseReference
    var title: String
    var answer: String
    var contentUrl: String
    var photoUrl: String
    var createdAt: String
    var feeling: String
    var kind: String
    var text: String
    var uid: String
    var measurements: [String : String]

    //MARK: Initialization
    init?(snapshot: FIRDataSnapshot) {
        if let data = snapshot.value as? [String : Any] {
            self.ref = snapshot.ref

            title = data["title"] as? String ?? ""
            answer = data["answer"] as? String ?? ""
            contentUrl = data["content_url"] as? String ?? ""
            photoUrl = data["photo_url"] as? String ?? ""
            createdAt = data["created_at"] as? String ?? ""
            feeling = data["feeling"] as? String ?? ""
            kind = data["kind"] as? String ?? ""
            text = data["text"] as? String ?? ""
            uid = data["uid"] as? String ?? ""
            measurements = data["measurements"] as? [String : String] ?? [:]
        } else {
            return nil
        }
    }
}

请注意这是如何确保有一个正确的快照。如果快照中没有值,请注意如何为每个属性设置默认值。显然,您可以指定任何您希望的默认值。我以空字符串为例。

即使您希望属性为nil,您也应该至少像上面的代码一样更新您的代码以检查有效的快照。

当然,您可以进行组合,其中一些属性不能为 nil 而另一些可以。这取决于您的需求。

关于ios - 如何在不允许可选值的情况下使用 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43266409/

相关文章:

json - Alamofire 在解包可选时意外发现 nil,但我可以看到 JSON

ios - 如何拦截标签栏选择?

Swift/Firebase 从 TableView 更改值

ios - 为什么在 Storyboard 中添加约束时所有元素都会移动?

objective-c - 基本问题 : how do I include a category method in another class?

swift - MKDirectionResponse 响应总是返回 nil

javascript - angularfire,检索数据的回调

ios - Swift 函数在应用程序中有效,但在 override func viewDidLoad() 中无效

objective-c - View 的变换不会随着设备旋转而改变

ios - 以编程方式打开 FaceTime,无需任何数字或苹果 ID - iOS8