web-dev-qa-db-ja.com

初期化される前にクロージャによってキャプチャされた変数

クエリからの結果の数を整数に格納しようとしています。これを使用して、テーブル内の行の数を決定できます。ただし、次のエラーが表示されます:Variable 'numberOfGames' captured by a closure before being initialized'行のquery.findObjectsInBackgroundWithBlock{

また、別のエラーVariable 'numberOfGames' used before being initialized行のreturn numberOfGames

2つのエラーを含む関数は次のとおりです。

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

クロージャー内で使用する前に変数を初期化する必要があります。

Apple documentation

クロージャーを使用してプロパティを初期化する場合、クロージャーが実行される時点でインスタンスの残りの部分はまだ初期化されていないことに注意してください。これは、プロパティにデフォルト値が設定されていても、クロージャ内から他のプロパティ値にアクセスできないことを意味します。また、暗黙の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
    }
_
32
Icaro