2016-09-26 10 views
0

私はStackOverflowで数多くの類似した投稿を検索しましたが、ラムダがコルーチン内にあるので、私の問題に近づかないようです。無名関数から値を返すためのインライン構文は何ですか?

マイコード:

public string FetchInternetItems() 
    { 

     WWW www = new WWW(someURL); 

     StartCoroutine(WaitForRequest(www, callback => { 

     if(!string.IsNullOrEmpty(callback)) 
     { 
     Debug.Log("Successfully worked.."); 
     } 
     else 
     { 
     return "Did not connect to remote server."; 
     } 

     })); 

WaitForRequestからの抜粋:

IEnumerator WaitForRequest(WWW www, Action<string> callback) 
    { 
     yield return www; 

     if (string.IsNullOrEmpty(www.error)) 
     { 
      if (callback != null) 
      { 
       callback(www.text); 
      } 
     } 
     else 
     { 
      Debug.Log("WWW Error: " + www.error); 
     } 
    } 

コルーチンクラスがここで見つけることができます:エラーを返しますhttps://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html

Anonymous function converted to a void returning delegate cannot return a value 

何も届かない限り、callbackを返信し、代わりにDid not connect to remote server.というメッセージを返すことをお勧めします。

+0

「WaitForRequest」の2番目のパラメータのように聞こえるのは、voidデリゲートです。この場合、値を返すことはできません。彼が価値を戻すためにはどんなことが期待されますか? –

+0

ああ。それは理にかなっている。私は 'string'値を期待しています。私の謝罪もその方法を含めないことです。 – Trip

+0

私の質問は、戻り値を_receive_する必要がありますか?コードはちょうどコルーチンを開始しているので、戻り値を受け取るものはありません。また、 'Asction 'は 'string'を返しますが、' Action ' –

答えて

4

WaitForRequest -methodのパラメータは、Action<string>コールバックです。 Actionは、何も返さないvoid)を返すメソッドのデリゲートに過ぎないため、このようなデリゲートでreturn ...を呼び出すことはできません。しかし、あなたのデザインはとにかく壊れているようです。エラーが発生した場合に文字列を返します。すべて正常に実行された場合、矛盾していると思われるWWWインスタンスを返すのですか?あなただけの代わりに文字列を返すエラーの場合に例外をスローする可能性

IEnumerator WaitForRequest(WWW www, Action<string> callback) 

あなたは今、このように呼び出すことができます。

StartCoroutine(WaitForRequest(www, callback => 
{ 
    if(!string.IsNullOrEmpty(callback)) 
    { 
     Debug.Log("Successfully worked.."); 
    } 
    else 
    { 
     throw new Exception("Did not connect to remote server."); 
    } 
} 

ここでの考え方はどうかということですサーバーに接続できないため、アプリケーションが適切に動作し続ける方法がないため、例外を残すことができます。

+0

これは意味があります。私は文字列よりもむしろ例外をスローすることが大いにあります。私はそれを試してみます – Trip

+0

ああ、そんなに作る。その応答に感謝します。あなたが言及したように戻り値を切り替えると、私のメソッド 'WaitForRequest'が' voidが反復子インタフェース型ではないので、反復子ブロックにすることはできません 'と言うようになり、 'FetchInternetItems'は' voidから変換できないSystem.Collections.IEnumerator' – Trip

+0

あなたは 'StartCoroutine'のコードも提供するべきです、何らかの理由で' Enumerator'型の引数を期待していると思います。 – HimBromBeere

1

は、あなたのメソッドのシグネチャを見てください:

public string FetchInternetItems() 

それはあなたが文字列を返すように期待しています。

メソッドスコープから文字列を返す代わりに、匿名メソッドから返すことになります。にcoroutineWaitForRequestを待たずに

Anonymous function converted to a void returning delegate cannot return a value

FetchInternetItems()はその実行を終了します:

return "Did not connect to remote server."; 

上記の行は、あなたがそれが次のエラーの原因となることはできません匿名メソッドから文字列を返すようにしようとしていると述べています終わり。したがって、両方の実行はお互いに関連していません。 FetchInternetItems()に返信する返信文字列を使用することはできないと言っています。

FetchInternerItems(result => { Debug.Log("This is response text from www : " + result);}); 

ORこのような:

FetchInternerItems(OnCompleted); 


void OnCompleted(string response) 
{ 
    Debug.Log("This is response text from www: " + response); 
    // You can do other stuff here... 
} 

この問題を回避するには、簡単な解決策は、これは、あなたがこのメソッドを呼び出す方法です

public void FetchInternetItems(Action<string> callBack); 

に署名を変更することです

知りたいことがあれば。コメントのセクションでお尋ねください。お役に立てれば。

関連する問題