Swift中使用numberOfRowsInSection的void函数中非预期的非无效返回值

时间:2018-10-16 22:59:45

标签: ios swift firebase firebase-realtime-database

这个问题已经被问过无数次了,但是在我的情况下似乎没有任何作用。如您在下面的代码中看到的,我为UITableViewDataSource创建了View Controller的扩展。我正在尝试从Firebase实时数据库中提取信息,并根据获取的信息返回某个Int。问题是,每当我尝试从Firebase快照中返回Int时,都会收到此错误:“ void函数中非预期的非void返回值。”我了解原因,但不确定如何使代码正常工作。有解决方案吗?

我的代码:

extension LikeOrDislikeViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        let uid  = Auth.auth().currentUser?.uid

        Database.database().reference().child("Num Liked").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in
            if let dictionary = snapshot.value as? [String: AnyObject] {
                let numMoviesLiked = ((dictionary["Number of Movies Liked"] as? Int))!

                if numMoviesLiked%4 == 0 {
                    return numMoviesLiked/4
                }
            }
        })
        return 10
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = UITableViewCell()
        cell.backgroundColor = UIColor.red
        tableView.rowHeight = 113
        cell.textLabel?.text = "\(indexPath.row)"

        return cell
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是数据库块中的return numRows,它不考虑返回任何值,而且该调用是异步的,因此不要期望它在{{的return 10之前完成1}},完全删除此部分并将其放入numberOfRowsInSection

viewDidLoad

从逻辑上讲,如果您仅在比较Database.database().reference().child("Num Liked").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in if let dictionary = snapshot.value as? [String: AnyObject] { let numMoviesLiked = ((dictionary["Number of Movies Liked"] as? Int))! if numMoviesLiked/4 == 0 { numRows = numMoviesLiked/4 self.tableView.reloadData() } } }) 时这样做,那么numMoviesLiked/4 == 0将始终为0