論理演算子は、ブール論理値の true と false を変更または結合します。Swift は、C ベースの言語にある 3 つの標準的な論理演算子をサポートしています。

  • 論理 NOT (!a)
  • 論理 AND (a && b)
  • 論理 OR (a || b)

論理 NOT 演算子

論理 NOT 演算子 (!a) は、ブール値を反転、つまり true を false にし、false を true にします。

論理 NOT 演算子は前置演算子で、空白を空けず、作用する値の直前に置きます。次の例でも見られるように、”not a“(a でない)と読むことができます。

let allowedEntry = false
if !allowedEntry {
    print("ACCESS DENIED")
}
// "ACCESS DENIED" と出力

if !allowedEntry は、「入場を許可されない場合は」と読むことができます。続く行は、「入場を許可されない」つまり allowedEntry が false である場合のみ実行されます。

ブールの定数および変数の名前を慎重に選択し、二重否定や複雑な論理分を避けることで、コードの可読性と簡潔さを維持することができます。

論理 AND 演算子

論理 AND 演算子 (a && b) は、両方の値が true の場合のみ、式全体が true となる論理式です。

どちらかの値が false の場合、式全体も false となります。実際、初めの値が false の場合、2 つ目の値は評価さえされず、式全体が true になることはありません。これは短絡評価として知られています。

次の例は、2 つの Bool 値の両方が true の場合のみアクセスが許可されます。

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// "ACCESS DENIED" と出力

論理 OR 演算子

論理 OR 演算子 (a || b) は、パイプ文字を 2 文字続ける中置演算子です。2 つの値のうちいずれか 1 つでも true の場合、式全体が true となる論理式です。

論理 AND 演算子と同様に、論理 OR 演算子でも短絡評価となります。論理 OR 演算子の左側が true であれば、右側が評価されることはなく、式全体の結果が変わることはありません。

次の例では、初めの Bool 値 (hasDoorKey) は false ですが、2 つ目の値 (knowsOverridePassword) は true です。片方は true なので、式全体は true と評価され、アクセスが許可されています。

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// "Welcome!" と出力

論理演算子の結合

複数の論理演算子を結合することができます。

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// "Welcome!" と出力

この例は、&& と || の演算子を複数使用した長い複合式になっています。しかし、&& および || の演算子は 2 つの値にのみ作用するので、実際には 3 つの小さな式が連結されているということになります。

この例は、「正しいドアコードを入力して網膜スキャンをパスした場合、またはドアキーを持っている場合、または緊急優先パスワードを知っている場合、アクセスを許可する」と読むことができます。

enteredDoorCode と passedRetinaScanhasDoorKey の値に基づくと、初めの 2 つの部分式は false となります。しかし、緊急優先パスワードがわかっているため、複合式全体は true と評価されます。

NOTE
Swift の論理演算子 && と || は左結合であり、複数の論理演算子で構成された複合式の評価は、左側にある部分式からとなります。

明示的な括弧

厳密には必要ありませんが、複雑な式を読みやすくする目的で、括弧を含めることが効果的な場合があります。上で見たドアアクセスの例では、意図を明確にするために複合式の初めの部分を丸括弧で囲むと効果的です。

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
// "Welcome!" と出力

この括弧により、初めの 2 つの値を全体のロジックと分けて考えられるようになります。複合式の結果は変化しませんが、意図が読み手にわかりやすくなります。簡潔さより読みやすさを優先し、意図を明確にするために括弧を使用してください。


Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.