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ことですが、別の方法があるかどうか疑問に思っていました。

4

1 に答える 1

3

まず、load メソッドが非同期の場合、出力時にエラーとデータは常に 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)")
}
于 2016-12-08T20:45:41.823 に答える