2017-04-26 11 views
2

私はかなり簡単な質問がありますが、C++スレッドでも同様の答えしか見つけられませんでした。コンパイラは、getUserFromServer関数が例外をキャッチできるとしても、return値が必要であることを示す関数に不満を表明しています。戻り値を求めているのは明らかですが、状況を適切に処理する方法がわかりません。スローする関数の戻り値

1つの方法は、ダミーuserのようなものを作成して返しますが、それは良いとは言えません。もう1つの方法は、返品タイプOptionalを作成することですが、それはちょうど良い考えではない別のレベルにnil-checkの責任を移すだけです。どんな助けでも助けになります。

実際のコードで想定される動作をシミュレートするための設定です。

enum TestError: Error { 
    case JustError 
} 

class User {} 
class ServerClient { 
    func getUser(really: Bool) throws -> User { 
     var uza: User? 
     if really { 
      uza = User() 
     } 
     guard let user = uza else { 
      throw TestError.JustError 
     } 
     return user 
    } 
} 

func getUserFromServer() -> User { 

    let client = ServerClient() 
    let user: User 

    do { 
     user = try client.getUser(really: true) 
     return user 
    } catch TestError.JustError { 
     print("just an error occured") 
    } catch { 
     print("something terrible happened") 
    } 
} //Error: missing return in a function 

答えて

3

だから私は、発信者だ、と私はこのコード行を書き想像:

let user = getUserFromServer() 
print(user) 

それは何らかの形で失敗します。すばらしいです。あなたは何をしたいですか? userはどうすればよいですか?何を印刷する必要がありますか? (ここには正しい答えはありません。?質問は本当にはそれになりたい何をすべきかです)

あなたはuserがnilになりたい場合は、getUserFromServerUser?を返す必要があります。 userをデフォルトのユーザーにしたい場合は、それを作成する方法が必要です。呼び出し元が全く印刷しないようにするには(そして代わりに何らかのエラーを処理する)、getUserFromServer()をスローする必要があります。クラッシュさせたい場合はfatalErrorgetUserFromServerに追加する必要があります。これらはすべて有効ですが、の何かを実行する必要があります。その何かがあなた次第です。

しかし、このコードを調べるだけの質問があれば、他の動作が必要な場合を除き、デフォルトでオプションにする必要があります。あなたがすでにエラーを "処理"しているので、これは "正常な"ものになります。

+0

ありがとう、これは私が必要としていたものです。 – inokey