2016-12-08 17 views
3

クロージャでは、クロージャによってキャプチャされた値だけでなく、同じ名前を何らかの形で使用できます。同じ名前の迅速なキャプチャ値

func load(withResource resource: Resource) { 
    var data: A? 
    var error: Error? 

    load(resource: resource) { (result, error) in 
     data = result // Ok! 
     error = error // error! 
    } 

    print("data: \(data), error: \(error)") 
} 

私たちは格納されたプロパティを話していた場合selfを使用してのようなものがあるかどうかを考えていますが、これらのVARSは、関数スコープ内で宣言されています。

errorの名前を変更するのが最も簡単な方法ですが、別の方法があるかどうか疑問に思っていました。

答えて

3

最初に、ロードメソッドが非同期の場合、エラーとデータは印刷時に常にnilになります。

あなたの質問への直接的な答えは、クロージャの範囲内で、「エラー」の値がパラメータの値であり、関数からエラーにアクセスする方法がないことです。

は明らかにこれを回避するために多くのオプションがありますが、1つのきれいなオプションは、タプルにあなたの情報を作るために次のようになります。

func load(withResource resource: Resource) { 

    var closureData: (data: A?, error: Error?)? 

    load(resource: resource) { (result, error) in 
     closureData = (result, error) 
    } 

    //print(closureData) if you don't need to format it) 
    print("data: \(closureData.data), error: \(closureData.error)") 
} 
+0

ありがとう!素晴らしい答え!プリントは本当に私のプロジェクトで間違いです。私はセマフォを使用していましたが、これは私がペーストしたコードで意味をなさないと思います。 – richy