English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift guard 文

この記事では、Guard 文を使用してプログラムの実行フローを制御する方法を学びます。

Swift If 文特定の条件(ブール値)に基づいて操作を実行する方法を説明しています。この記事では、guard 文が if 文よりも優れている理由を学び、プログラムの流れを制御し、よりシンプルでクリーンなコードを書く方法を学びます。

Swift guard 文

Guard 文の主な用途は、ある条件が満たされた場合にプログラムのコントロールを特定の範囲外に移行することです。これらの文は、特定の条件(ブール値)に基づいて文を実行する if 文と似ていますが、if 文とは異なり、guard 文は条件が満たされない場合にのみ実行されます。

また、guard 文は範囲から退出する必要があります。したがって、guard 文の最後にユーザープログラムのコントロール文 return、break、continue または throw を使用する必要があります。

guard 文の構文

guard expression else {
	//文
	//コントロール文を含む必要があります: return、break、continue または throw。
}
  • ここでのexpressionは、布尔値の表現(trueまたはfalseを返す)です。

  • expressionの値がfalseとして計算された場合、コードブロック内のguard文を実行します。

  • expressionの値がtrueとして計算された場合、guard文はコードブロック内で実行をスキップします。

guard文はどのように動作しますか?

注意:guard文の終わりには、return、break、continue、またはthrowの制御文を含める必要があります。

例1:guard文はどのように動作しますか?

シンプルな有効なguard文の例:

guard true else {
	print("条件不满足")
}
print("条件を満たしています")

このプログラムを実行すると、以下の結果が表示されます:

条件を満たしています

上述プログラムでは、guardが布尔値true(条件を満たしています)を含んでいます。guard文は条件を満たさない場合にのみ実行されるため、guard内の文は実行されません。これがprint("条件を満たしています")を実行し、スクリーンに表示される理由です。条件を満たしていますの理由です。

今、条件をfalseに変更します:

例2:guard文はスコープを退出する必要があります

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関数に包装します。

例3:関数内部のguard文

Swiftの関数内以下のようにguard文を使用します:

func someFunction() {
	guard false else {
		print("条件不满足")
		return
	}
	print("条件を満たしています")
}
someFunction()
print("関数呼び出し後に表示される Hello")

上記のプログラムを実行すると、出力は以下のようになります:

条件不满足
関数呼び出し後に"Hello"が表示されます。

上述プログラムでは、guard条件の計算結果がfalseであり、そのためguard内部の文を実行します。最初の文print("条件不满足")はコンソールに表示されます。:条件が満たされない場合

そして、return文は関数の実行を終了し、print("Hello, after function call")は関数呼び出し後の文がコンソールに表示されます:関数呼び出し後のオプションを表示

例4:選択可能なguard

私たちは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文を使用すると、関数内で未包装の値を使用できます。

例5:複数の条件を持つ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 文で関数を終了します。