[TIL] 21.03.05.(Fri)

6314 ワード

実行内容

  • 公平なプログラミングによって石切り布ゲームプロジェクトStep 2の実施とPR
  • を完成した.
  • 学習経路思惟導図により
  • を整理する.
    作成
  • TWL
  • 学習内容


    エラー処理(throw do-try-catch文)


    エラーが発生する可能性のあるメソッドでエラーを投げ出し、エラーを受信するメソッドでどのように処理するかを定義する構文.以下の例で説明します.
    // Code 1-1. 에러를 던지는 메서드 (에러 발생이 예상되는 메서드)
    private func getUserInput() throws -> Int {
        guard let userInput: String = readLine(), let resultInteger: Int = Int(userInput) else {
            throw GameError.invalidInput
        }
        if !(resultInteger >= 0 && resultInteger <= 3) {
            throw GameError.outOfRange
        }
        return resultInteger
    }
    この方法は,じゃんけんゲームでユーザ入力を受け,外部バインドにより外部入力を安全に処理し,ユーザ入力が有効範囲内であるか否かを判別する方法である.個別の方法で分離は可能であるが,エラー処理がどのように行われているのか一目で分かるため,構成によって異なる利点と欠点がある.
    まず、メソッド宣言子にエラーを投げ出し、値矢印を返す前にthrowsキーワードを追加します.次のエラーが発生した構文(上記の例では、外部処理が行われていない場合(nilまたは整数入力、invalidInput)、入力値が入力範囲を超えている場合(整数型で0から3outOfRange以外)、エラーオブジェクト(throw)が放出されます.では、今から間違いを受け入れる方法を見てみましょう.
    // Code 1-2. 에러를 받아 처리하는 메서드 (do-try-catch)
    func play() {
        repeat {
            printMenu()
            do {
                var userInput: Int = 0
                userInput = try getUserInput()
                if userInput == 0 {
                    exitGame()
                }
                choicePlayerHands(userInput)
                decideWinnerByMode()
            } catch {
                handleError()
            }
        } while true
    }
    上記の方法は、ジャンケンゲーム全体の実行を担当するplay()の方法であり、getUserInput()の方法で投げ出されたエラーを処理する方法である.do-try-catch句の簡単な言葉は、以下のように構成されています.
    一連の動作を実行し、(do)動作間でエラーが発生する可能性のあるメソッド(try)を実行し、実際にエラーが発生した場合はそれを捕まえ、その後(catch)どのように処理するかを試みます.
    実際には、上記の方法も同じ論理ストリームから構成される.userInput領域変数を初期化し、ユーザ入力が0である場合、exitGame()メソッドが呼び出され、その間にgetUserInput()メソッドが実行され、ここでエラーが発生した場合、それを捉えてhandleError()メソッドを呼び出す形で記述される.コードコメントの1つの意見は、do-try-catch文がコードを深めるため、一部の開発者が好まないことです.

    学習ツリーの整理



    現在学んでいる内容を木型に整理し,不足点をピンク色の影で表す.

    問題/厄介な問題


    エラー処理


    プロジェクトの実行中に無効な入力(0~3以外の範囲の整数およびその他の入力)を処理するために、-1のような無意味な整数値を返す方法を作成しました(戻り値をInt,func getUserInput() -> Intと指定します).GameErrorの列挙タイプによってinvalidInputエラーが宣言されたとしても、-1というエラー処理の整数を導入するために、方法がGameError.invalidInput.rawValueの値を返すことは可読性に影響を及ぼす可能性があると考えられる.したがって,本プロジェクトではthrow,do-try-catch文を用いてエラーを処理する.

    解決策

  • throw do-try-catch文でエラーを処理します.次に、エラーをエラー・オブジェクトに戻す方法を考えます.checkInvalidInput(ユーザInput:)->エラータイプを返すメソッドを作成したり、SWIFTのResultを理解したりする方法が期待されます.