Swiftの論理演算子(Logical Operators)

論理演算子

ここでは論理演算子について、その基本的な使い方を説明していきます。論理演算子は複数のブール値を評価するのに必須な演算子です。論理演算は3つの演算子の組み合わせによって全て表現することができます。最終的には、複合的な論理式を自由自在に使いこなせるようになりたいですね。

論理演算子(logical operator)

論理演算子はBool値を変えたり、組み合わせたりするための演算子です。3つあるので順番に紹介します。

Logical NOT

Logical NOT operator(!aはブール値(boolean value)を反転させます。!aは「aではない(not a)」と読めます。

// Logical NOT(!)の使用例
let catIsDog = false
if !catIsDog {
  print("猫は犬ではありません")
}
// "猫は犬ではありません"と表示

if !catIsDogは「もし、catIsDogでなければ」という条件判定です。上記の例ではcatIsDogfalseで初期化してますので、if文の条件判定は真となり「猫は犬ではありません」という文字列が表示されます。

Logical AND

Logical AND operator(a && bは、abのブール値が両方ともtrueの時のみtrueを返すoperatorです。日本語で表現すると「aかつb」です。

// Logical AND(&&)の使用例
let normalPassword = true
let twoStepVerification = false
if normalPassword && twoStepVerification {
  print("ログインしました")
} else {
  print("ログインできません")
}
// "ログインできません"と表示

上記の例のように、どちらか片方でもfalseだと全体の評価式はfalseとなります。また、公式マニュアルにも書いてありますが、もし最初のブール値がfalseなら(この場合normalPasswordfalse)、右側のブール値twoStepVerificationはスキップされます。

Logical ANDでは1つでもfalseなら、全体がfalseとなるので、このような省エネ仕様になっているようです。これは短絡評価(short-circuit evaluation)と呼ばれています。

Logical OR

Logical OR operator(a || bは、abのブール値のどちらか一方がtrueならtrueを返すoperatorです。日本語では「aまたはb」でしょう。

// Logical OR(||)の使用例
let normalPassword = true
let twoStepVerification = false
if normalPassword || twoStepVerification {
  print("ログインしました")
} else {
  print("ログインできません")
}
// "ログインしました"と表示

このような仕様のアカウントにはログインしたくないですが、上記の例ではnormalPasswordtrueですから(twoStepVerificationfalseですが)、全体の評価式はtrueとなります。

Logical ANDと同様に、Logical ORにも短絡評価が組み込まれています。Logical ORの場合、最初のブール値がtrueなら右側は評価されません。

論理演算の組み合わせ

ここまでで紹介した論理演算子を組み合わせた、複合的な論理式を組むことも可能です。

// 論理演算子の組み合わせ例
let userAccount = true
let emailAddress = false
let yourUrl = false
let yourComment = true
if userAccount && emailAddress || yourUrl || yourComment {
  print("コメントを送信しました")
} else {
  print("コメントを送信できませんでした")
}
// "コメントを送信しました"と表示

一見複雑に見えますが、論理演算は左から順番に評価しますので、分解すると以下の3つの論理式を順番に評価していることが分かります。

  • userAccount && emailAddress(この結果をA
  • A || yourUrl(この結果をB
  • B || yourComment

上記の例では、yourCommenttrueなので、全体がtrueとなって、「コメントを送信しました」と表示されることが分かります。

論理式の評価には影響しませんが、可読性を上げたり、製作者の意図を伝えやすくするために、

if (userAccount && emailAddress) || yourUrl || yourComment {
...

のようなカッコ()(parentheses)を明示的につけることを、公式マニュアルでは推奨しています。

参考:

“Readability is always preferred over brevity; use parentheses where they help to make your intentions clear.”

抜粋:: Apple Inc. “The Swift Programming Language”。 iBooks https://itun.es/jp/jEUH0.l

まとめ

  • ブール値(true, false)を反転させる場合、Logical NOT!aを使う
  • Logical AND(a && b)はabが両方trueの時のみtrueを返す
  • Logical OR(a || b)はabのどちらか片方がtrueであればtrueを返す
  • 論理演算子を組み合わせることにより、複合的な論理判定をすることができる