見出し画像

今でしょ!Swift - 基本的な演算子

代入、算術、比較などの演算を行う。

演算子は、値のチェックや変更、合成するために使われる特殊な記号や用語です。例えば、加算演算子(+)は let i = 1 + 2 のように 2 つの数値を足します。論理 AND 演算子(&&)は、 2 つのブール(真偽)値を組み合わせます。

Swift は、代入演算子(=)を、本当は等価演算子(==)を使おうと思っていた所へ間違って使えなくしています。算術演算子(+, -, *, /, % など)は、オーバーフローを検知して発生しないようにできています。

値の範囲を簡単に表すための範囲演算子も提供しています。

https://www.swiftlangjp.com/language-guide/basic-operators.html

用語

演算子は単項、二項、三項と呼ばれるものがあります。

-a、!b 、c!  ・・・ 単項
2 + 3  ・・・ 2項
a ? b : c ・・・ 3項

演算子が影響を与える値はオペランドと呼びます。1 + 2 という式は、+ が中置演算子で 1 と 2 がオペランド。

以下演算子の説明となります。

代入演算子

=

代入演算子は、例えば a = b とすると、a の値を b の値で置き換えることができます(代入ができます)。

let b = 10
var a = 5

bの値は10、a の値は 5となっています。

a = b

aにbを代入することでaの値がbの値と同じになり、a にはbの値の 10 が入ります。これでaもbも10となります。


複数の値を持つタプルの場合、一度に複数の定数や変数に代入することができます。

let (x, y) = (1, 2)
// x は 1、 y は 2 と等しい

C 言語や Objective-C の代入演算子と異なり、Swift の代入演算子は値を返しません。そのため次のようなことはできません。

if x = y {
    // x = yは値を返さないのでエラーになる。
}

この特徴から代入演算子(=)を等価演算子(==)と間違えて使用することを防げます。上記の例では、if x = y はコンパイルエラーになります。正解は

if x == y{
  何らかの処理
}

とするとうまくいきます。

算術演算子

加算(+)
減算(-)
乗算(*)
割算(/)

普段から使い慣れている計算に使うものです。足したり、引いたり。

1 + 2       // 3
5 - 3       // 2
2 * 3       // 6
10.0 / 2.5  // 4.0

以下はあまり聞きなれないものですが便利なものになります。

剰余演算子 あまりを計算してくれるもので"%"を使います。

9 % 4    // 1

単項減算演算子 変数の頭に"-"をつけて正負を切り替えることができます。

let three = 3
let minusThree = -three       // minusThree は -3
let plusThree = -minusThree  // plusThree は 3

単項加算演算子   変数の頭に"+"をつけることもできます。機能としては何もありせん。

複合代入演算子

代入演算子(=)と他の演算子を組み合わせることができます。

var a = 1
a += 2
// a は 3   a += 2 は a = a + 2 

比較演算子

・等価演算子(a == b)
・不等価演算子(a != b)
・より大きい(a > b)
・より小さい(a < b)
・等しいかそれ以上(a >= b)
・等しいかそれ以下(a <= b)

1 == 1   // 1 は 1 と等しいなので true
2 != 1   // 2 は 1 と等しくないので true
2 > 1    // 2 は 1 とより大きいので true
1 < 2    // 1 は 2 とより小さいので true
1 >= 1   // 1 は 1 とより大きいまたは等しいので true
2 <= 1   // 1 は 1 とより小さくないかつ等しくないので false

比較演算子は、true かどうかのブール値(true or false)を判定。if文などで使われます。

let name = "world"

if name == "world" {
    print("こんにちは, world")
} else {
    print("ごめんなさい \(name), あなただと気づきませんでした")
}

name は "world" と等しいので、 こんにちは, world が出力されます。こんな感じで対象物、この場合は最初に定義している定数"nama"と"world"を比較しています。


三項条件演算子

三項条件演算子は、

question ? answer1 : answer2

という形式の、3 つの部分を持った特別な演算子

if question {
    answer1
} else {
    answer2
}

のシュートカット。

nil 合体演算子

nil 合体演算子

(a ?? b)

a != nil ? a! : b 

のショートカット。


範囲演算子

a...b  a から b までの連続した、a も b も含んだ範囲を定義

for index in 1...5 {
    print("\(index) × 5 is \(index * 5)")
}
// 1 × 5 は 5
// 2 × 5 は 10
// 3 × 5 は 15
// 4 × 5 は 20
// 5 × 5 は 25

a..<b  a から b まで連続しているものの b は含まない範囲を定義
"b"は含まれないので、例えば配列を扱う場合は

let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
    print("人物 \(i + 1) の名前は \(names[i])")
}
// 人物 1 の名前は Anna
// 人物 2 の名前は Alex
// 人物 3 の名前は Brian
// 人物 4 の名前は Jack

と使えます。配列の要素の数は4ですが、この場合4は範囲に含まれないので0から3までループします。

a..., …a, …<a     1 つの方向へ可能な限り続く範囲に対して違った形式で書くことができる

let names = ["Anna", "Alex", "Brian", "Jack"]

for name in names[2...] {
    print(name)
}
// Brian
// Jack

for name in names[...2] {
    print(name)
}
// Anna
// Alex
// Brian

for name in names[..<2] {
    print(name)
}
// Anna
// Alex

範囲にある値が含まれているかどうかのチェックもできます

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true


論理演算子

論理演算子は、ブール論理値の true と false を変更したり、組み合わせたりします。

・否定 NOT (!a)     論理否定演算子
・論理積 AND (a && b) 論理積演算子
・論理和 OR (a || b)     論理和演算子

反転

!a のような論理否定演算子は、true を false に、false を true にブール値を反転させます。以下例示です。

let allowedEntry = false

if !allowedEntry {
    print("アクセス拒否")
}
// アクセス拒否

この場合falseで定義しているものがtrueに変更され、処理されています。

組み合わせ
両方ともにtrueの場合に処理されます。

let enteredDoorCode = true
let passedRetinaScan = false

if enteredDoorCode && passedRetinaScan {
    print("こんにちは!")
} else {
    print("アクセス拒否")
}
// アクセス拒否

論理和
片方の値が true の場合に、全体の式も true となり処理されます。

let hasDoorKey = false
let knowsOverridePassword = true

if hasDoorKey || knowsOverridePassword {
    print("こんにちは!")
} else {
    print("アクセス拒否")
}
// こんにちは!


明示的な括弧

厳密には必要ありませんが、複雑な式の意図を分かりやすくするために、括弧(())を使うことができます。

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("こんにちは!")
} else {
    print("アクセス拒否")
}
// こんにちは!

この記事が気に入ったらサポートをしてみませんか?