今でしょ!Swift - 基本的な演算子
用語
演算子は単項、二項、三項と呼ばれるものがあります。
演算子が影響を与える値は、オペランドと呼びます。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
比較演算子
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"を比較しています。
三項条件演算子
三項条件演算子は、
という形式の、3 つの部分を持った特別な演算子
if question {
answer1
} else {
answer2
}
のシュートカット。
nil 合体演算子
nil 合体演算子
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 を変更したり、組み合わせたりします。
反転
!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("アクセス拒否")
}
// こんにちは!
この記事が気に入ったらサポートをしてみませんか?