【Swift】switch文

switch文とは、変数や定数の値によって処理を分岐したい場合に使う制御構文です。
基本的にはif文で同じ処理を実装する事ができますが使いわけとしては、
複雑な条件分岐であればif文の方が適していますが、単純な条件や分岐が多い場合はswitch文が適しています。

前回は guard文 について書きました。

今回は switch文 について書いていこうと思います。

switch文とは

switch文 とは、変数や定数の値によって処理を分岐したい場合に使う制御構文です。
基本的には if文 で同じ処理を実装する事ができますが使いわけとしては、
複雑な条件分岐であれば if文 の方が適していますが、単純な条件や分岐が多い場合は switch文 が適しています。

switch文の書式

 switch 値または式{
 case 値1: 処理1
 case 値2: 処理2
 .
 .
 .
 default: デフォルトの処理
 }

switch キーワードを書いた後に値、または式を書きます。
{ } の中に case キーワードを書いて、値 1 だった場合は処理 1 、値 2 だった場合は処理 2 のように分岐を必要な分、箇条書きします。
値と処理は : で区切ります。
default には、どの case にも当てはまらない場合に実行される処理を書きます。

switch文を使った例

let hp = [50, 75, 100, 125, 150]
let result = Int.random(in: 0 ..< hp.count) //0~4
func strategy(HP: Int){
    switch HP{
    case 50:
        print("めいれいさせろ")
    case 75:
        print("いのちだいじに")
    case 100:
        print("いろいろやろうぜ")
    case 125:
        print("バッチリがんばれ")
    case 150:
        print("ガンガンいこうぜ")
    default:
        print("パルプンテ")
    }
}
strategy(HP: hp[result])

配列hp を定義して、Int型 の値( 要素 )を複数代入します。
定数result には 0 ~ 4 の整数がランダムに代入されるようにして、インデックス番号として使います。
この 定数resulthp[ result ] として、 配列hp の 0 ~ 4 番目の中からランダムで要素にアクセスします。
ランダムに選択された要素の値によって処理を分岐して、値と一致した case があれば、その case の処理を実行します。
値がどの case にも当てはまらない場合は、default の処理が実行されます。
関数strategy の引数に hp[ result ] を指定して実行すると、ランダムに選択された値によって switch文 で処理を分岐します。

switchコードimg

範囲演算子を使った switch文 の例

switch文case に範囲演算子を使うことで、値がその範囲に含まれているかどうか判定することができます。

let hp = [50, 75, 100, 125, 150]
let result = Int.random(in: 0 ..< hp.count) //0~4
print(result)
func strategy(HP: Int){
    switch HP{
    case 0...50: //0~50
        print("めいれいさせろ")
    case 51...75: //51~75
        print("いのちだいじに")
    case 76...100: //76~100
        print("いろいろやろうぜ")
    case 101...125: //101~125
        print("バッチリがんばれ")
    case 126...150: //126~150
        print("ガンガンいこうぜ")
    default: 
        print("パルプンテ")
    }
}
strategy(HP: hp[result])

case に範囲演算子を使って、値がどの case の範囲に当てはまるか判定して、当てはまった case の処理を実行します。

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

switchコードimg2

上の例では 関数strategy の引数を Int型 で指定していますが、FloatDouble型 を指定すると、FloatDouble型 の値を判定することもできます。

let hp:[Float] = [50.0, 75.0, 100.0, 125.0, 150.0]
let result = Int.random(in: 0 ..< hp.count) //0~4
print(result)
print(hp[result])

func strategy(HP: Float){
    switch HP{
    case 0.0...50.0: //0.0~50.0
        print("めいれいさせろ")
    case 51.0...75.0: //51.0~75.0
        print("いのちだいじに")
    case 76.0...100.0: //76.0~100.0
        print("いろいろやろうぜ")
    case 101.0...125.0: //101.0~125.0
        print("バッチリがんばれ")
    case 126.0...150.0: //126.0~150.0
        print("ガンガンいこうぜ")
    default:
        print("パルプンテ")
    }
}

strategy(HP: hp[result])
switchコードimg3

これと同じ処理は if文 でも書くことができますが、else if をいくつも重ねて書くことになると思います。 条件や分岐の数によっては読みづらいコードになることもあると思うので、こういった単純な条件で分岐が多い場合などは switch文 で書いた方が可読性は高いかもしれません。
以上 switch文 についてでした。

次回は class について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

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

【Swift】break文とcontinue文

break文 とは、for文 や switch文 などのループ処理を中断する事ができる構文です。
基本的には if文 などと併用して条件を付けて使います。
ループ中に、もし指定した条件を満たしたらループを中断して、次の処理に移りたい時などに使います。

前回は 集合型 について書きました。

今回は break文 と continue文 について書いていこうと思います。

break文

break文 とは

break文 とは、for文switch文 などのループ処理を中断する事ができる構文です。
基本的には if文 などと併用して条件を付けて使います。
ループ中に、もし指定した条件を満たしたらループを中断して、次の処理に移りたい時などに使います。

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

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

break文 の使い方

使い方は break と書くだけです。

break

break文 を使った例

let slot = [145, 214, 405, 315, 777, 343]

for i in 0 ..< 20 {
    let stop = slot.randomElement()
    print("\(i)回転目 : \(stop ?? 123)")
    
    if stop == 777 {
        print("大当たり!")
        break
    }
}

//実行結果
/*
0回転目 : 315
1回転目 : 315
2回転目 : 343
3回転目 : 315
4回転目 : 145
5回転目 : 145
6回転目 : 315
7回転目 : 214
8回転目 : 405
9回転目 : 777
大当たり!
*/

配列slot に 3 桁の整数を要素として複数代入しています。
for文 は最大 20 回ループするようにしました。
処理は 配列slot の要素をランダムに取り出して、取り出した値を 定数stop に代入します。
print( ) で何回目のループなのかと 定数stop に代入された値を出力します。
if文 で、もし 定数stop に代入された値が 777 だったら、print( )”大当たり!” と出力して、break で中断します。
for文 は 20 回としていますが、20 回ループする前に 777 が選択されたら途中でも for文 を中断します。
また、777 が選択されなければ 20 回ループして for文 を中断します。

randomElement( ) メソッドはコレクション型の要素をランダムに返すメソッドです。返ってくる値は Optional型 なのでアンラップして print( ) で出力しています。

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

break-continueコードimg

continue文

continue文とは

continue文 とは、continue と書いた後の処理をスキップする事ができる構文です。
break文 はループ自体を中断して次の処理に移行しますが、continue文 は次回のループ処理に移行する。という違いがあります。
break文 同様 continue文 も条件を付けて使う場合が多いので、if文 などと併用することが多いと思います。

continue文 の使い方

使い方は continue と書くだけです。

continue

continue文 を使った例

上の break文 のコード例を流用

let slot = [145, 214, 405, 315, 777, 343]

for i in 0 ..< 20 {
    let stop = slot.randomElement()
    if stop == 777 {
        print("jackpot!")
        continue
    }
    print("\(i)回転目 : \(stop ?? 123)")
}

//実行結果
/*
0回転目 : 214
1回転目 : 405
2回転目 : 405
3回転目 : 315
4回転目 : 214
jackpot!
6回転目 : 214
7回転目 : 315
8回転目 : 405
9回転目 : 315
10回転目 : 343
11回転目 : 343
12回転目 : 343
13回転目 : 405
jackpot!
15回転目 : 145
16回転目 : 405
17回転目 : 343
18回転目 : 145
19回転目 : 343
*/

for文 は 20 回ループ、処理は 配列slot の要素をランダムに取り出して、取り出した値を 定数stop に代入します。
もし 定数stop に代入された値が 777 だったら、jackpot! と出力し continue して、一番下の print( ) はスキップして次回のループに移行します。
777 以外であれば if文 の条件から外れているので、if文 はスキップされて 一番下の print( ) で何回目のループなのかと 定数stop に代入された値を出力します。
つまり、777 だった時のみ continue して次回のループに、それ以外は continue されずに回転数と値を出力する、という流れになります。

break文break と書かれた後 for文 自体を中断してループを抜けてしまいますが、
continue文continue と書かれた後の処理をスキップするだけなので、for文 は指定通り20 回ループされています。

break-continueコードimg2

以上 break文 と continue文 についてでした。

次回は guard文 について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

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

【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文の中にfor文、if文の中にif文、for文の中にif文などを入れ子することをネストすると言います。

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

for文についてはこちらで紹介しています。

前回は 複合代入演算子 について書きました。

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

ネストとは

ネストとは”入れ子”という意味で、ネスティングとも言います。
例えば for文 の中に for文if文 の中に if文for文 の中に if文 などを入れ子することをネストすると言います。

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

for文 についてはこちらで紹介しています。

for文の中にfor文

for文 の中に for文 をネストする例

//for文の中にfor文をネスト
for i in 0 ... 2 {
    for j in 0 ... 2 {
        print(i, j) //iとjに代入されている値をprintするだけの処理
    }
}

//実行結果
/*
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
 */


ij に代入されている値を print するだけの処理です。
は終了値を含む範囲演算子なので上の例だと最初の for文 も中の for文 も、 0,1,2 と、3 回繰り返します。

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

※コードが流れていく順番
最初 for文i0 が代入されて中の for文 に進む

中の for文 が、0,1,2 と 3 回処理が繰り返される

最初の for文 に戻って次は 1 が代入されて中の for文 に進む

また中の for文 が、0,1,2 と 3 回処理が繰り返される

最初の for文 に戻って次は 2 が代入されて中の for文 に進む

また中の for文 が、0,1,2 と 3 回処理が繰り返される

最初の for文3 回目まで繰り返したので for文 から抜ける
という順番でコードが流れていきます。

nestコードimg

for文の中にif文

for文 の中に if文 をネストする例

//for文の中にif文をネスト
for i in 1 ... 10 {
    if i % 2 == 0 {
        print(i)
    }
}

//実行結果
/*
2
4
6
8
10
 */

for文 を 10 回繰り返して、もし i の値が偶数の値だった場合に printi の値を出力するというコードです。

if文 の条件式は i%2==0 となっています。
これは、もし i の値を 2 で割った余りが 0 だったら true なので、i の値を print で出力します。
余りが 0 じゃないということは奇数なので false となり、その場合 if文 はスキップされます。
==!= に変えると奇数のみの出力になります。

nestコードimg2


あまり多重にネストするとエラーの原因や、思った通りの処理にならなかったり可読性も下がりそうなので、使う時はよく考えて注意しながら使う必要がありそうです。
以上 ネスト についてでした。

次回は スコープ について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

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

【Swift】if文とif-else文

if文とは、条件式によって処理を分岐したい場合に使う構文で、もし〇〇だったらこの処理、もし〇〇じゃなかったら別の処理、どっちにも当てはまらない場合はこの処理、のように処理を分岐させたい場合に使う構文です。
条件式がtrueであれば、if文の処理が実行されて、falseであればそのif文の処理はスキップされます。

前回は 論理演算子 について記事を書きました。

今回は if文 と if-else文 について書いていこうと思います。

if文とは

if文 とは、条件式によって処理を分岐したい場合に使う構文で、もし〇〇だったらこの処理、もし〇〇じゃなかったら別の処理、どっちにも当てはまらない場合はこの処理、のように処理を分岐させたい場合に使う構文です。
条件式が true であれば、if文 の処理が実行されて、false であればその if文 の処理はスキップされます。

if文の書式

if文 は、もしそうであれば( Bool値true であれば )この処理を実行します。という構文です。
Bool値false だった場合 if文 はスキップされます。

 if Bool値、または条件式 {
     Bool値、条件式の結果がtrueであればこの中の処理が実行される
     trueでなければこのif文はスキップされる
 }

if文 は頭に、if キーワードを付けます。

if文のを使った例

//if文の書き方例
var a:Bool = true
var b:Bool = false

if a {
    print("あいうえお") //aはtrueなのでこのif文の処理が実行されます
}

if b {
    print("かきくけこ") //bはfalseなのでこのif文はスキップされます
}
if-elseコードimg

比較演算子を使った if文

書式

var a = 1
var b = 2

if a > b {
    aとbの条件式の結果がtrueであればここの処理が実行されます
}

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

比較演算子を使った if文 の例

//比較演算子を使ったif文の例
var HP:Int = 30 //好きな整数を代入してください

//もしHPが80より大きかったらこのif文は実行されます(80は含まれない)
if HP > 80 {
    print("ガンガンいこうぜ")
}

//もしHPが60以上であればこのif文は実行されます(60も含まれる)
if HP >= 60 {
    print("じゅもんつかうな")
}

//もしHPが30以下であればこのif文は実行されます(30も含まれる)
if HP <= 30 {
    print("いのちだいじに")
}

Int型変数HP には 30 が代入されています。
1 つ目の if文 の条件は HP80 より大きかったら実行されます。( 80 は含まれない )
2 つ目の if文 の条件は HP60 以上であれば実行されます。( 60 も含まれる )
3 つ目の if文 の条件は HP30 以下であれば実行されます。( 30 も含まれる )
変数HP の値には 30 が代入されているので、当てはまっている 3 つ目( 1 番下 )の if文 のみ実行されて、他 2 つの if文 はスキップされます。

if-elseコードimg

if-else文

if-else文 は、if文Bool値 、または条件式が false だった場合 if文 の処理はスキップして、else文 の処理を実行するという構文です。

if-else文 の書式

if Bool値、または条件式 {
    Bool値、または条件式がtrueであればここの処理が実行されます
} else {
    Bool値、または条件式がfalseであればここの処理が実行されます
}

else文 は、else キーワードを書いて中括弧 { } の中に処理を書きます。

if-else文 を使った例

//if-else文の書き方例
var a:Bool = false

if a { //aがtrueであればこのif文の処理が実行されます
    print("aの値はtrueです")
} else { //aがtrueでなければこのelse文の処理が実行されます
    print("aの値はfalseです")
}
if-elseコードimg3

比較演算子を使った if-else文

書式

var a = 1
var b = 2

if a > b {
    aとbの条件式がtrueであればここの処理が実行されます
} else {
    aとbの条件式がfalseであればここの処理が実行されます
}

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

比較演算子を使った if-else文 の例

//比較演算子を使ったif-else文の例
var point:Int = 99 //好きな整数を代入してください

//もしpointの値が100以上であればこのif文が実行されます
if point >= 100 {
    print("レベルが1上がった!")
//そうでなかったら(pointの値が99以下だったら)このelse文が実行されます
} else {
    print("\(point)の経験値をかくとく!")
}

Int型変数point には 99 が代入されています。
point の値が 100 以上であれば true になり、if文 の処理が実行されます。
99 以下であれば false になるので、else文 の処理が実行されます。
上の例では print(\(point)の経験値をかくとく!”) が実行されます。

if-elseコードimg5

point の値を 100 以上に変えると if文 の条件式は true になるので、
if文print(“レベルが1上がった!”) が実行されます。

else-if

分岐を増やしたい場面もよく出てくると思います。
そんな時は else-if を使うことで分岐を増やすことが出来ます。
if文 の後に else if キーワードを書いて その後に条件式を書き、{ } の中に処理を書きます。

書式

var a = 1
var b = 2

if a > b {
    aとbの条件式がtrueであればここの処理が実行されます
} else if a < b {
    上の条件式がfalseであれば、次にこのelse-if文が判定され、もしtrueであればここの処理が実行されます
} else {
    上の条件式がどれもfalseであればここの処理が実行されます
}

else-if で分岐を増やす例

//else-ifで分岐を増やす例
var jp = 3
var us = 2

if jp > us { //jpの値がusより大きかったら
    print("Japan Winner!")
    
} else if jp < us { //jpの値がusより小さかったら
    print("USA Winner!")
    
} else { //上の条件式がどれもfalseであれば
    print("Draw!")
}

まず最初の if文 の条件式が判定されて、false であれば次の else-if文 の条件式が判定されます。そして else-if文 の条件式も false だった場合に else文 が実行されるという流れになります。

jp の値が us の値より大きければ print(“Japan Winner!”)
jp の値が us の値より小さければ print(“USA Winner!”)
上の 2 つの条件式が false つまり同じ値であれば print(“Draw!”)
が実行されます。

上記の例では 変数 jp3変数us2 が代入されています。
最初の if文 の条件式で true になるので print(“Japan Winner!”) が実行されます。

if-elseコードimg4

これで分岐を増やす事ができましたが、分岐の数が 3 つや 4 つ、またはそれ以上になってくるととても読みづらくなってきます。そういう場合は if文 とは別に Switch文 という条件分岐出来る構文があるので、そっちの方がいい場合もあります。
Switch文 についてはまた今度書こうと思います。

比較演算子と論理演算子を使った if文

書式

var a = 1
var b = 2
var c = 3

//&&(and、かつ)
if a < b && b < c {
   aがbより小さい かつ bがcより小さい場合にここの処理が実行される
}

//||(or、または)
if a > b || a < c {
    aがbより大きい または aがcより小さい場合にここの処理が実行される
}

&& (and、かつ)演算子は、左辺と右辺の値がどっちも true の時のみ実行されます。
|| (or、または)演算子は、左辺と右辺の値どちらかが true であれば実行されます。

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

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

比較演算子と論理演算子を使った if文 の例

//比較演算子と論理演算子を使ったif文の例
var kokugo = 60
var eigo = 80

//&&
if kokugo >= 80 && eigo >= 80 { //kokugoが80以上かつ、eigoが80以上であればここの処理が実行されます
    print("合格!")
} else { //上の条件から外れた場合はここの処理が実行されます
    print("不合格!")
}

//||
if kokugo >= 80 || eigo >= 80 { //kokugoが80以上または、eigoが80以上であればここの処理が実行されます
    print("合格!")
} else { //上の条件から外れた場合はここの処理が実行されます
    print("不合格!")
}

変数kokugo60eigo80 が代入されています。


上の if文 は、kokugo の値が 80 以上かつ、eigo の値が 80 以上であれば実行されます。
&& は左辺と右辺の両方の値が true でなければ実行されないので、この if文 はスキップされて、else文 が実行されます。

下の if文 は、kokugo の値が 80 以上または、eigo の値が 80 以上であれば実行されます。
|| は左辺と右辺どちらかが true であれば実行されるので、この if文 の処理が実行されて、else文 はスキップされます。

if-elseコードimg6

以上 if文 と if-else文 についてでした。結構よく使う構文なので押さえておきたいポイントだと思います。

次回は for文 について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

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