【Swift】三項演算子

三項演算子とは、オペランド(被演算子)を 3 つ必要とする演算子で、Bool値 ( true , false ) によって代入する値を分岐できる演算子です。
簡単な分岐であれば、1 行のコードで if文 と同じ処理をする事ができます。
if文 を使って分岐するほどではない時に使います。

前回は 構造体 について書きました。

今回は 三項演算子 について書いていこうと思います。

三項演算子とは

三項演算子とは、オペランド(被演算子)を 3 つ必要とする演算子で、Bool値 ( true , false ) によって代入する値を分岐できる演算子です。
簡単な分岐であれば、1 行のコードで if文 と同じ処理をする事ができます。
if文 を使って分岐するほどではない時に使います。

if文 についてはこちらの記事で紹介しています。

三項演算子の書式

条件式 ? trueだった場合の値 : falseだった場合の値

条件式 の後に ? マークを書きます。
その後に、
true だった場合の値 : false だった場合の値
を書きます。

条件式の結果が
true であれば左辺の値
false であれば右辺の値
が代入されます。

三項演算子を使った例

整数の大きさによって処理を分岐する例です。

var hp = 60
var strategy: String

//三項演算子の例
strategy = hp <= 50 ? "いのちだいじに" : "ガンガンいこうぜ"
print(strategy) //ガンガンいこうぜ

変数 hp には 60 が代入されています。
条件式は hp の値が 50 以下( 50 も含まれる)であれば true 、それ以外であれば false となります。
上の例では、hp の値が 50 以上なので false となり、右辺の値が 変数 strategy に代入されます。

比較演算子 についてはこちらの記事で紹介しています。

if文 で書いた場合

上のコードを if文 で書いた場合の例

var hp = 60
var strategy: String

//三項演算子の例
strategy = hp <= 50 ? "いのちだいじに" : "ガンガンいこうぜ"
print(strategy) //ガンガンいこうぜ

//上のコードをif文で書いた場合
if hp <= 50 {
    strategy = "いのちだいじに"
} else {
    strategy = "ガンガンいこうぜ"
}
print(strategy) //ガンガンいこうぜ

三項演算子を使った分岐は print関数 を抜かすと 1 行で書けるのに対し、同じ処理を if文 で書くと 5 行になってしまいます。
このぐらいの単純な分岐であれば三項演算子を使った方が可読性が高いかもしれません。

分岐を増やしたい場合

分岐を増やしたい場合の書式

条件式a ? trueだった場合の値a : 条件式b ? trueだった場合の値b : falseだった場合の値

条件式 a の後に ? true だった場合の値 a と書きます。
コロン : を書いて 条件式 b を書きます。
その後に ? trueだった場合の値 b : falseだった場合の値
を書きます。

コードが読まれていく順序

最初の 条件式 atrue であれば true だった場合の値 a が代入される。

false であれば次の 条件式 b に進む

条件式 btrue であれば true だった場合の値 b が代入される

false であれば false だった場合の値 が代入される

という流れになります。

三項演算子を使って分岐を増やしたい場合の例

var hp = 0
var strategy: String

//分岐を増やしたい場合の例
strategy = hp == 0 ? "ザオラル!" : hp <= 50 ? "いのちだいじに" : "ガンガンいこうぜ"
print(strategy) //ザオラル!

条件に 変数hp の値が 0 だった場合の処理を追加しました。

if文 で書いた場合

上のコードを if文 で書いた場合の例

var hp = 0
var strategy: String

//分岐を増やしたい場合の例
strategy = hp == 0 ? "ザオラル!" : hp <= 50 ? "いのちだいじに" : "ガンガンいこうぜ"
print(strategy) //ザオラル!

//上のコードをif文で書いた場合の例
if hp == 0 {
    strategy = "ザオラル!"
} else if hp <= 50 {
    strategy = "いのちだいじに"
} else {
    strategy = "ガンガンいこうぜ"
}
print(strategy) //ザオラル!
ternary-operatorコードimg

2 択の単純な分岐であれば三項演算子を使った分岐の方が短いし楽ですが、分岐が増えてくると 1 行とはいえ見づらいと思います。
分岐が増えるかもしれない場合は最初から if文switch文 を使った方がいいかもしれません。
以上 三項演算子 についてでした。

次回は タプル について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/

【Swift】複合代入演算子

複合代入演算子とは、前の記事で紹介した算術演算子と代入を組み合わせた演算子のことを言います。
複合代入演算子を使うとコードを簡潔にできたり、読みやすくなります。
インクリメントやデクリメントなんかにも使われてるのをよく見かけます。
まず複合代入演算子の前に算術演算子について理解しておきましょう。

前回は for文と範囲演算子 について書きました。

今回は 複合代入演算子 について書いていこうと思います。

複合代入演算子とは

複合代入演算子とは、前の記事で紹介した算術演算子と代入を組み合わせた演算子のことを言います。
複合代入演算子を使うとコードを簡潔にできたり、読みやすくなります。
インクリメントやデクリメントなんかにも使われてるのをよく見かけます。
まず複合代入演算子の前に算術演算子について理解しておきましょう。

算術演算子 についてはこちらで紹介しています。

では複合代入演算子の種類を見ていきましょう。

複合代入演算子の種類

演算子意味
+=足し算(加算)と代入
-=引き算(減算)と代入
*=掛け算(乗算)と代入
/=割り算(除算)と代入
%=割り算の余り(剰余)と代入

演算例

複合代入演算子を使った演算例と、使わなかった場合の例

+= (加算と代入)

// +=
var a = 1
a += 1
print(a) //2

//複合代入演算子を使わなかった場合
a = a + 1

-= (減算と代入)

// -=
var b = 2
b -= 1
print(b) //1

//複合代入演算子を使わなかった場合
b = b - 1

*= (乗算と代入)

// *=
var c = 2
c *= 2
print(c) //4

//複合代入演算子を使わなかった場合
c = c * 2

/= (除算と代入)

// /=
var d = 4
d /= 2
print(d) //2

//複合代入演算子を使わなかった場合
d = d / 2

%= (剰余と代入)

// %=
var e = 5
e %= 2
print(e) //1

//複合代入演算子を使わなかった場合
e = e % 2
+=コードimg

ちょっとですが簡潔になり可読性も良くなったと思います。
以上 複合代入演算子 でした。

次回は ネスト について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/

【Swift】for文と範囲演算子

for文とは繰り返し構文のことで、for-in文とも言います。
指定した回数分の処理を繰り返す事ができる構文です。同じ処理を複数回ループさせたい時に使います。
範囲演算子とはfor文と一緒に使うことが多い演算子で、開始値から終了値までの範囲を決めるときに使います。
まずはよく使う範囲演算子からみていきましょう。

前回は if文 と if-else文 について記事を書きました。

今回は for文 と範囲演算子について書いていこうと思います。

for文と範囲演算子とは

for文 とは繰り返し構文のことで、for-in文 とも言います。
指定した回数分の処理を繰り返す事ができる構文です。同じ処理を複数回ループさせたい時に使います。
範囲演算子とは for文 と一緒に使うことが多い演算子で、開始値から終了値までの範囲を決めるときに使います。
まずはよく使う範囲演算子からみていきましょう。

範囲演算子の種類

範囲演算子意味
終了値を含む
..<終了値を含まない

この 2 種類がよく使われる範囲演算子だと思います。

for文の書式

for 定数名 in 整数A 範囲演算子 整数B {
 繰り返したい処理
 }

for文 は頭に for キーワードを付けます。
定数名は何でもいいですが、基本 ij とすることが多いと思います。
整数 A より、整数 B の方が大きい整数でなければエラーになります。

for文 の書き方

//for文の書き方例1
for i in 1 ... 10 {
    print(i)
}

この例は print( i ) を 10 回ループさせる例です。
範囲演算子の は、終了値を含む演算子なので 1 ~ 10 回目までループします。

※コードの流れ
i には最初 1 が代入される

print( i ) を実行

for文 の閉じかっこ } まで処理が来たら一度破棄される

戻って次は i2 が代入される

また print( i ) を実行、、、
という流れで回数分コードが読まれていきます。

//for文の書き方例2
for i in 1 ..< 10 {
    print(i)
}

この例は上の例 1 と似ていますが、範囲演算子が から ..< に変わっています。
この ..<終了値を含まない演算子なので、ループする回数は 1 ~ 9 回目までとなります。

for-inコードimg

Int型 の変数や定数であれば、範囲の所を a ba ..< b のような書き方も出来ます。

var a = 1
var b = 10

for i in a ... b {
    print("\(i)回目")
}

for i in a ..< b {
    print("\(i)回目")
}
for-inコードimg2

インクリメントとデクリメント

インクリメントとは、何かの数字に 1 足すことをインクリメントと言います。
デクリメントはその逆で、何かの数字から 1 引くことをデクリメントと言います。

例えば 1 を 10 回インクリメントしたい時、for文 を使わず書くとこうなります。

var a = 0
a = a + 1
a = a + 1
a = a + 1
a = a + 1
a = a + 1
a = a + 1
a = a + 1
a = a + 1
a = a + 1
a = a + 1
print(a) //10

1 行 1 行インクリメントしていかないと 10 回足せません。
これを for文 で書きます。

var a = 0

for _ in 1 ... 10 {
    a = a + 1
}
print(a) //10

結果は同じで、コードが短くなりました。可読性も向上したと思います。

for文 の定数名の所がアンダーバー _ になっていますが、これは for文 の中の処理で使わない場合に、アンダーバー _ として省略になっています。
以上 for文 と 範囲演算子 についてでした。

次回は 複合代入演算子 について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/