web-dev-qa-db-fra.com

Variable capturée par fermeture avant d'être initialisée

J'essaie de stocker le nombre de résultats d'une requête dans un entier afin de pouvoir l'utiliser pour déterminer le nombre de lignes dans une table. Cependant, j'obtiens l'erreur suivante: Variable 'numberOfGames' captured by a closure before being initialized' sur la ligne query.findObjectsInBackgroundWithBlock{.

Je reçois également une autre erreur Variable 'numberOfGames' used before being initialized sur la ligne return numberOfGames.

Voici la fonction qui contient les deux erreurs:

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
    }
31
winston

Vous devez initialiser la variable avant de l'utiliser dans une fermeture:

selon Apple

Si vous utilisez une fermeture pour initialiser une propriété, n'oubliez pas que le reste de l'instance n'a pas encore été initialisé au moment où la fermeture est exécutée. Cela signifie que vous ne pouvez accéder à aucune autre valeur de propriété depuis votre fermeture, même si ces propriétés ont des valeurs par défaut. Vous ne pouvez pas non plus utiliser la propriété self implicite ni appeler aucune des méthodes de l'instance.

La commande var numberOfGames: Int Suffit de la déclarer pour l'initialiser, vous pouvez utiliser var numberOfGames = Int() ou 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
    }
32
Icaro