English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
この記事では、Guard 文を使用してプログラムの実行フローを制御する方法を学びます。
Swift If 文特定の条件(ブール値)に基づいて操作を実行する方法を説明しています。この記事では、guard 文が if 文よりも優れている理由を学び、プログラムの流れを制御し、よりシンプルでクリーンなコードを書く方法を学びます。
Guard 文の主な用途は、ある条件が満たされた場合にプログラムのコントロールを特定の範囲外に移行することです。これらの文は、特定の条件(ブール値)に基づいて文を実行する if 文と似ていますが、if 文とは異なり、guard 文は条件が満たされない場合にのみ実行されます。
また、guard 文は範囲から退出する必要があります。したがって、guard 文の最後にユーザープログラムのコントロール文 return、break、continue または throw を使用する必要があります。
guard expression else { //文 //コントロール文を含む必要があります: return、break、continue または throw。 }
ここでのexpressionは、布尔値の表現(trueまたはfalseを返す)です。
expressionの値がfalseとして計算された場合、コードブロック内のguard文を実行します。
expressionの値がtrueとして計算された場合、guard文はコードブロック内で実行をスキップします。
注意:guard文の終わりには、return、break、continue、またはthrowの制御文を含める必要があります。
シンプルな有効なguard文の例:
guard true else { print("条件不满足") } print("条件を満たしています")
このプログラムを実行すると、以下の結果が表示されます:
条件を満たしています
上述プログラムでは、guardが布尔値true(条件を満たしています)を含んでいます。guard文は条件を満たさない場合にのみ実行されるため、guard内の文は実行されません。これがprint("条件を満たしています")を実行し、スクリーンに表示される理由です。条件を満たしていますの理由です。
今、条件をfalseに変更します:
guard false else { print("条件不满足") } print("条件を満たしています")
上述プログラムでは、保護条件の計算結果がfalseであり、そのためelse内のprint("Condition not met")文を実行するべきですが、エラーメッセージを受信します:'guard'のbodyはfall throughできません。'return'または'throw'を使用してスコープを退出してください。
エラーメッセージは、return、break、continue、またはthrow文を使用してguard文からプログラムコントロールを移行する必要があることを意味します。今からreturnを使用します。return文は関数内でのみ使用できるため、上記のコードをSwift関数に包装します。
Swiftの関数内以下のようにguard文を使用します:
func someFunction() { guard false else { print("条件不满足") return } print("条件を満たしています") } someFunction() print("関数呼び出し後に表示される Hello")
上記のプログラムを実行すると、出力は以下のようになります:
条件不满足 関数呼び出し後に"Hello"が表示されます。
上述プログラムでは、guard条件の計算結果がfalseであり、そのためguard内部の文を実行します。最初の文print("条件不满足")はコンソールに表示されます。:条件が満たされない場合
そして、return文は関数の実行を終了し、print("Hello, after function call")は関数呼び出し後の文がコンソールに表示されます:関数呼び出し後のオプションを表示
私たちはSwiftのOptionalでif文の使用が見られます。-let文でOptionalを解包します。ただし、if文の代わりにguard文を使用することもできます。-let文で選択可能な文を展開すると、guard文を使用する利点があります。-let文で選択可能な変数を展開する主な利点は、解包変数の範囲を拡張できることです。
以下の例でこれを見てみましょう:
func changeOptionalStringToUpperCase() { var name: String? guard let temp = name else { print("名前がnilです。処理できません") return } print("大文字:\(temp.uppercased())") } changeOptionalStringToUpperCase()
上記のプログラムを実行すると、出力は以下のようになります:
名前がnilです。処理できません
上記のプログラムでは、未包装の値tempがguard文の定義範囲外で使用されていることが見られます。nameがnil値を含む選択可能な値として定義されているため、guard文はその値を解包できません。
したがって、guard else内で実行される文は、Nameがnilであることを印刷し、return文で関数を終了します。上記のguard文とif else文の等価なコードは以下の通りです:
func changeOptionalStringToUpperCase() { var name: String? if let temp = name { print("大文字:\(temp.uppercased())") } print("名前がnilです。処理できません") return } //ここでアクセスする方法は何ですか?解決策:guardを使用する } changeOptionalStringToUpperCase()
注意、上記の2つの文は有効であり、同じ作業を完了します。しかし、if文を使用すると、-let文のとき、if文内で使用することはできません。-let文の外で未包装(unwrapped)の値を使用します。しかし、guard文を使用すると、関数内で未包装の値を使用できます。
Guard文は、条件を複数指定することもできます。これらの条件はカンマ(,)で区切られます。以下のようになります:
func changeOptionalStringToUpperCase() { var name: String? = "" guard let temp = name, temp.count > 0 else { print("名前がnilまたは空文字列です。処理できません") return } print("大文字化された: \(temp.uppercased())") } changeOptionalStringToUpperCase()
上記のプログラムを実行すると、出力は以下のようになります:
名前がnilまたは空文字列です。 処理できません
上記のプログラムでは、guard 文が二つの条件を含み、コロンで区切られています。
最初の条件 let temp = name はオプショナル引数を解凍し、私たちのインスタンスではこの条件が true を返します。二つ目の条件 temp.count > 0 は解凍された文字列が0個以上の文字を含むかどうかを確認します。私たちの例では結果が false です。
したがって、guard 文内の文は実行文 print("名前がnilまたは空文字列です。処理できません") 、その出力Nameがnilまたは空文字列である場合。 コントロールターミナルで処理できず、return 文で関数を終了します。