+
)は let i = 1 + 2
のように 2 つの数値を足します。論理 AND 演算子(&&
)は、if enteredDoorCode && passedRetinaScan
のように 2 つのブール値を組み合わせます。=
)を、本当は等価演算子(==
)を使おうと思っていた所へ間違って使えなくするために、値を返しません。算術演算子(+
, -
, *
, /
, %
など)は、保持している値の型の許容範囲を超えて予期せぬ結果が起きることを防ぐために、オーバーフローを検知して発生しないようにしています。Swift のオーバーフロー演算子を使用することで、オーバーフローに対する挙動を変えることもできます。詳細はOverflow Operators(オーバーフロー演算子)に記載しています。a..<b
や a...b
のような値の範囲を簡単に表すための範囲演算子も提供しています。unary
)、二項(binary
)、三項(ternary
)があります。-a
のような単一のターゲットで動作します。前置(prefix
)演算子は !b
のようにターゲットの直前に置かれ、後置(postfix
)演算子は c!
のようにターゲットの直後に置かれます2 + 3
のように 2 つの値をターゲットで動作します。これは 2 つのターゲットの間に置かれるので中置(infix
)演算子ですa ? b : c
)1 + 2
という式は、+
が中置演算子で 1
と 2
がオペランドです。a = b
とすると、a
の値を b
の値で初期化、または更新します。=
)を等価演算子(==
)と間違えて使用することを防げます。上記の例では、if x = y
はコンパイルエラーになります。+
)-
)*
)/
)a &+ b
のようにオーバーフロー演算子(&-
)を使用してオーバーフローさせることができます。詳細はOverflow Operators(オーバーフロー演算子)を参照ください。String
の連結もすることができます。a % b
のような剰余演算子は、a
の中に b
がどのくらい含まれているのかを計算し、その(_剰余_と呼ばれる)余った値を返します。NOTE 剰余演算子(%
)は、他の言語ではモジュロ演算子とも呼ばれています。しかし、厳密に言うと、負数に対するSwiftの挙動は、モジュロ演算ではなく剰余演算を行います。
9 % 4
を計算すると、まず 9
の中にいくつ 4
が含まれているかの結果を出します。9
の中には 2 つの 4
があり、剰余は 1
です(オレンジ色の部分)。a % b
へ解答するために、%
演算子は次の方程式を計算して reminder
を返します。a = (b x some multiplier) + remainder
some multiplier
には a
に収まる b
の倍数の最大数が入ります。9
と 4
をこの方程式に当てはめるとこうなります:9 = (4 x 2) + 1
a
を負数にした場合も見てみましょう。-9
と 4
をこの方程式に当てはめるとこうなります:-9 = (4 x -2) + -1
-1
という剰余値を得られます。b
の位置に負数を入れても、その負の記号は無視されます。つまり、a % b
と a % -b
は常に同じ結果が得られます。-
を使用して切り替えることができます。これは_単項減算演算子_と呼ばれます。-
)は、操作する値の直前にスペースなしで付けます。+
)は、何も変えずに操作した値を返します。=
)と他の演算子を組み合わせることができます。1 つの例として、加算代入演算子(+=
)があります:a += 2
は a = a + 2
のショートカットです。効率的に、加算と代入が 1 つの操作に合成されて、同時に行われます。NOTE 複合代入演算子は値を返しません。例えば、let b = a += 2
と書くことはできません。
a == b
)a != b
)a > b
)a < b
)a >= b
)a <= b
)NOTE Swift では、2つの恒等作用素(===
と!==
)も提供しています。これは2つのオブジェクトが同じインスタンスを参照しているかどうかの確認ができます。より詳細は、Identity Operators(恒等作用素)を参照ください。
true
かどうかのブール値を返します。if
などの条件文でよく使われます。if
については、Control FLow(制御フロー)を参照ください。同じ型、同じ数の値を持ったタプル同士の比較もできます。タプルは左から右へと順番に値を比較します。それぞれの値の比較結果が全体の結果に反映されます。全て等しい場合、タプル同士は等しいと見なされます。例えば:1
は 2
より小さいので、(1, "zebra")
はタプルの他の値がどんな値でも (2, "apple")
よりも小さいと判定されます。既に最初の値同士でこのタプルの比較は完了しているので、"zebra"
と "apple"
の比較は関係ありません。しかし、最初の値が同じ場合、2 番目の値同士で比較されます。上記の 2, 3 行目がこれに当たります。(String, Int)
のタプルを比較していますが、String
も Int
も <
で比較できるので、タプル自身も比較ができます。反対に、(String, Bool)
は、Bool
が <
に使えないため、タプルの比較ができません。NOTE Swift の標準ライブラリは 要素数が 7 つ以下のタプルの演算子を提供しています。7 つ以上の要素数のタプルへは自身で実装しなければなりません。
question ? answer1 : answer2
という形式の、3 つの部分を持った特別な演算子です。これは、question
が true
か false
かを基に 2 つの式のどちらかを評価するショートカットです。question
が true
ならば、answer1
が評価され、false
だと answer2
が評価されます。rowHeight
を設定でき、2 つ目の例よりもより簡潔になっています。(a ?? b)
の _nil 合体演算子_は、オプショナルの a
にもし値が存在すれば a
をアンラップし、a
が nil
の場合は b
をデフォルトとして返します。式 a
は常にオプショナル型です。式 b
は a
が内包する値の型と一致していなけばなりません。a
が nil
ではない場合は、a
が内包する値へアクセスするために強制アンラップ(a!
)し、それ以外は b
を返します。nil 合体演算子は条件チェックとアンラップを 1 つにした、簡潔で読みやすく、より洗練された方法です。NOTEa
がnil
ではない場合、b
は評価されません。これは_短絡評価_と呼ばれます。
userDefinedColorName
は、オプショナルの String
として定義され、デフォルトは nil
です。userDefinedColorName
はオプショナル型なので、その値を検討するために、nil 合体演算子を使用することができます。上記の例では、colorNameToUse
という String
型の変数の初期値を決めるために nil 合体演算子を使用しています。userDefinedColorName
は nil
なので、式 userDefinedColorName ?? defaultColorName
は、defaultColorName
、つまり "red"
を返します。userDefinedColorName
に nil
以外が代入されていて nil 合体演算子でチェックを行った場合、userDefinedColorName
が内包する値がデフォルトの代わりに使われます:a...b
は、a
から b
までの連続した、a
も b
も含んだ範囲を定義します。a
を b
よりも大きい値にしてはいけません。for-in
ループでは:a..<b
のような_半開範囲演算子_は、a
から b
まで連続しているものの b
は含まない範囲を定義します。a
を b
よりも大きい値にしてはいけません。a
と b
が等しい場合、範囲は空になります。0..<count
は半開範囲演算子なので 3
(配列の最後のインデックス)までしかカウントしないことに注目してください。配列については、Arrays(配列)を参照ください。true
と false
を変更したり、組み合わせたりします。Swift では、C ベースの言語にもある 3 つの標準の論理演算子をサポートしています。!a
)a && b
)a || b
)!a
のような_論理否定演算子_は、true
を false
に、false
を true
にブール値を反転させます。a
ではない」と読み取れます。if !allowedEntry
は「もし許可されたエントリでなければ」と読み取れます。次の行は、「もし許可されたエントリでなければ」が true
だった場合のみ実行されます。つまり、if allowedEntry
は false
です。a && b
のような_論理積演算子_は、両方の値が true
の場合に、全体の式も true
になる論理式を作ります。false
ならば、全体の式は false
になります。実際、最初の値が false
ならば、既に全体の式が false
だと分かっているため、次の値は評価されません。これは短絡評価と呼ばれています。true
の場合のみ、アクセスを許可します。a || b
のような_論理和演算子_は、2 つの連続したバーティカルバー(||
)を使った中置演算子です。片方の値が true
の場合に、全体の式も true
になる論理式を作ります。true
ならば、既に全体の式も true
と分かっているので、右側は評価されません。Bool
値(hasDoorKey
)は false
ですが、2 番目の値(knowsOverridePassword
)は true
です。片方が true
なので、全体の式も true
になり、アクセスは許可されます:&&
と ||
を使用して複合式を作っています。&&
と ||
は 2 つの値しか操作することができないため、実際には 3 つの小さい式を繋げています。この例は下記のように読み取れます:enteredDoorCode
と passedRetinaScan
と hasDoorKey
の値を基に、最初の 2 つの部分式は false
です。しかし、緊急の上書きパスワードを知っているため、全体の式としては true
と評価されます。NOTE Swift の&&
と||
は左結合です。つまり、複数の論理演算子を持つ複合式の場合は、一番左の部分式から評価されます。
()
)を使用すると有用なときがあります。ドアへのアクセスの例では、意図を明確にするために、複合式の最初の部分に括弧を追加すると役に立ちます。