Подтвердить что ты не робот

Переменная, захваченная закрытием перед ее инициализацией

Я пытаюсь сохранить количество результатов запроса в целое число, чтобы я мог использовать его для определения количества строк в таблице. Тем не менее, я получаю следующую ошибку: Variable 'numberOfGames' captured by a closure before being initialized' в строке query.findObjectsInBackgroundWithBlock{.

Я также получаю еще одну ошибку Variable 'numberOfGames' used before being initialized в строке return numberOfGames.

Здесь функция, содержащая две ошибки:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        var user: PFUser!

        var numberOfGames: Int

        //...query code....removed to make it easier to read

        var query = PFQuery.orQueryWithSubqueries([userQuery, userQuery2, currentUserQuery, currentUserQuery2])
        query.findObjectsInBackgroundWithBlock{
            (results: [AnyObject]?, error: NSError?) -> Void in

            if error != nil {
                println(error)
            }

            if error == nil{

                if results != nil{
                    println(results)
                    numberOfGames = results!.count as Int
                }
            }
        }
        return numberOfGames
    }
4b9b3361

Ответ 1

Вам нужно инициализировать переменную перед ее использованием в закрытии:

Согласно документации Apple

Если вы используете закрытие для инициализации свойства, помните, что остальные экземпляра еще не была инициализирована в точке, что закрытие выполнено. Это означает, что вы не можете получить доступ к другим значения свойств из вашего закрытия, даже если эти свойства имеют значения по умолчанию. Вы также не можете использовать неявное свойство self, или вызвать любой из методов экземпляров.

Команда var numberOfGames: Int просто объявляет ее инициализацией, вы можете использовать var numberOfGames = Int() или var numberOfGames:Int = 0

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        var user: PFUser!
        var numberOfGames:Int = 0
        var query = PFQuery.orQueryWithSubqueries([userQuery, userQuery2, currentUserQuery, currentUserQuery2])
        query.findObjectsInBackgroundWithBlock{
            (results: [AnyObject]?, error: NSError?) -> Void in
            if error != nil {
                println(error)
            }
            if error == nil{
                if results != nil{
                    println(results)
                    numberOfGames = results!.count as Int
                }
            }
        }
        return numberOfGames
    }