预期 return 'Int' 的函数中缺少 return

Missing return in a function expected to return 'Int'

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    canvasCount { (value) in
        if let res = value {
            return res
        }
    } //Missing return in a closure expected to return 'Int'
} //Missing return in a closure expected to return 'Int'

Missing return in a closure expected to return 'Int'

func canvasCount(completion:@escaping((_ va:Int?) -> Int )) {

    ref.child("Canvas").observeSingleEvent(of: .value, with: { (snapshot) in
        completion( snapshot.children.allObjects.count)
    }) { (error) in
        print(error.localizedDescription)
        completion(nil)
    }

}

嗨,我希望能够 return snapshot.children.allObjects.count 作为一个整数。但是我用canvasCount函数得到了这个错误"Missing return in a closure expected to return 'Int'"。任何人都可以帮助我吗?

您需要完成,因为对 firebase 的调用是异步的

func canvasCount(completion:@escaping((_ va:Int?) -> () )) { 

    ref.child("Canvas").observeSingleEvent(of: .value, with: { (snapshot) in
           completion( snapshot.children.allObjects.count)
    }) { (error) in
        print(error.localizedDescription)
           completion(nil)
    }

}

canvasCount { (value) in 
   if let res = value {
      print(res)
   }
}

编辑: ------------------------------ --------------

声明一个实例变量

var counter = 0

里面viewDidLoad插入

canvasCount { (value) in
  if let res = value {
     self.counter =  res
     self.tableView.reloadData()
  }
} 

然后复制那些

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


func canvasCount(completion:@escaping((_ va:Int?) -> ())) {

    ref.child("Canvas").observeSingleEvent(of: .value, with: { (snapshot) in
        completion( snapshot.children.allObjects.count)
    }) { (error) in
        print(error.localizedDescription)
        completion(nil)
    }

}

您可以使用 completionInt 来满足您的要求,

var canvasCount: Int?

func canvasCount(completion: @escaping (_ count: Int) -> Void)  {
        ref.child("Canvas").observeSingleEvent(of: .value, with: { (snapshot) in
            completion(snapshot.children.allObjects.count)
        }) { (error) in
            print(error.localizedDescription)
            completion(nil)
        }
    }

//Get the result here
//Use weak self to avoid retain cycle
canvasCount { [weak self] (count) in
        if let count1 = count {
            self?.canvasCount = count1
            DispatchQueue.main.async {
                self?.tableView.reloadData()
            }
        }
    }

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