【Swift】guard文とguard-let文

guard文とは条件を満たさない場合の処理を書く構文で、コードを安全にするために使います。
if-else文でも同様のことはできますが、guard文は条件を満たさない場合のみの処理を書くことができます。
安全にメソッドの処理を途中で終了(return)したいとき、ループ処理の中断(break)したいときなどに使います。

前回は break文 と continue文 について書きました。

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

guard文

guard文 とは

guard文 とは条件を満たさない場合の処理を書く構文で、コードを安全にするために使います。
if-else文 でも同様のことはできますが、guard文 は条件を満たさない場合のみの処理を書くことができます。
安全にメソッドの処理を途中で終了( return )したいとき、ループ処理を中断( break )したいときなどに使います。

guard文 の書式

 guard 条件 else{
     処理
     return または break
 }

guard文 は基本的に関数内や制御構文内に書きます。
guard キーワードの後に条件を書いて、その後に else キーワードをつけます。
{ } の中に処理を書きますが、処理は条件が false だった場合に実行されます。
関数や制御構文のスコープを抜けるために return または break などが必要です。

guard文 を使った例

let slot = [145, 214, 405, 315, 777, 343]
let stop = slot.randomElement() ?? 123

func jackpot(num: Int){
    guard num == 777 else{
        print("\(num) ハズレ:関数から抜けます。")
        return
    }
    print("\(num) 大当たり!")
}

jackpot(num: stop)

配列slot に 3 桁の整数を要素として複数代入しています。
配列slot の要素の中からランダムに要素を取り出して、定数stop に代入します。

関数jackpot を定義し Int型 の引数を取って、引数の値によって処理を分岐します。
guard文 の条件は 引数num の値が 777 ではなかったらguard文 の処理が実行されて、return ( 関数から抜ける )します。これを 早期リターン と言います。
引数num の値が 777 だったらguard文 の条件から外れるので、return されずに次の print( ) が実行されアンラップした値を出力します。

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

関数jackpot の引数に 定数stop を指定して実行してみます。

let slot = [145, 214, 405, 315, 777, 343]
let stop = slot.randomElement() ?? 123

func jackpot(num: Int){
    guard num == 777 else{
        print("\(num) ハズレ:関数から抜けます。")
        return
    }
    print("\(num) 大当たり!")
}

jackpot(num: stop)

//実行結果
/*
145 ハズレ:関数から抜けます。
*/

ランダムに取り出された要素が 145 でした。
条件が false になるので、guard文 の処理を実行して return されます。
return されている( 関数から抜けている )ので、下の print( ) は実行されません。

guardコードimg

次は 777 だった場合の実行結果を見てみます。

let slot = [145, 214, 405, 315, 777, 343]
let stop = slot.randomElement() ?? 123

func jackpot(num: Int){
    guard num == 777 else{
        print("\(num) ハズレ:関数から抜けます。")
        return
    }
    print("\(num) 大当たり!")
}

jackpot(num: stop)

//実行結果
/*
777 大当たり!
*/

777 だった場合は、guard文 の条件から外れているので return されず下の print( ) が実行されます。

guardコードimg2

guard-let文

guard-let文 とは

guard-let文 とはオプショナルバインディングの 1 つで、Optional型 をアンラップするときに使います。
if-let文 でもアンラップすることができますが、if-let文スコープ内でのみアンラップした定数を使うことができるのに対し、guard-let文スコープの外でも定数を使うことができます。

guard-let文 の書式

guard let 定数名 = Optional型の値 else{
     アンラップに失敗した場合の処理
     return または break
 }

guard-let文guard文 同様、基本的に関数内や制御構文内に書きます。
guard let キーワードの後に定数名を書いて、アンラップしたい Optional型の値 の後に else キーワードを付けます。
{ } の中は、if-let文 と違い、Optional型の値 をアンラップ失敗した場合の処理を書きます。
アンラップ失敗したときの処理なので、スコープを抜けるために return または break などが必要です。

guard-let文 を使った例

let aHalf = ["1", nil, "2", nil, "3", nil]
print(type(of: aHalf)) //Array<Optional<String>>
let stop = Int.random(in: 0 ..< aHalf.count)

func judgement(){
    guard let unwrap = aHalf[stop] else{
        print("nil 関数から抜けます。") //nilだった場合
        return
    }
    print("\(unwrap)") //nilでなければアンラップして出力

}

judgement()

配列aHalfString型 の要素と、nil を 3 つずつ代入しています。
この配列は nil も代入されているので、Optional<String> 型 の配列になります。
random(in:) メソッドを使って、0 ~ 9 の中からランダムに返された値を 定数stop に代入します。
この 定数stop の値をインデックス番号として使います。

関数judgement を定義し、処理で guard-let文 を使って 配列aHalf の要素をアンラップしていきます。
ランダムに選択された aHalf[stop] の値が、アンラップ失敗( 値が nil )であれば、“nil 関数から抜けます。” と出力し return で関数を抜けます。
aHalf[stop] の値がアンラップ成功であれば、guard-let文 の条件から外れるので、return されずに 次の print( ) が実行されて、アンラップされた値を出力します。

if-else文 ではスコープ内に定義した定数はスコープ内でしか使えませんでしたが、guard-let文スコープ外でもアンラップした定数が使う事ができます。

random(in:) は、指定された範囲内でランダムな値を返すメソッドです。
Int.random(in: 0 ..< aHalf.count) とすると、0 から 配列aHalf の要素数 6 ( 6 は含まない ) となるので 0 ~ 5 の中からランダムな整数が返されます。

guardコードimg3

以上 guard文 についてでした。

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

実行環境

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】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/

【Swift】論理演算子

前回の記事で真理値型と比較演算子について書きましたが、論理演算子も条件分岐をして処理を分ける時などによく使われる演算子で、比較演算子とセットで使うこともあります。比較した値はBool値で返ってきます。
まずは論理演算子の種類を見ていきましょう。

前回は 真理値型と比較演算子 について記事を書きました。

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

論理演算子とは

前回の記事で真理値型と比較演算子について書きましたが、論理演算子も条件分岐をして処理を分ける時などによく使われる演算子で、比較演算子とセットで使うこともあります。比較した値は Bool値 で返ってきます。Bool型 についてはこちらの記事で紹介しています。

まずは論理演算子の種類を見ていきましょう

論理演算子の種類

各論理演算子の true になる場合と false になる場合をまとめてみました。

|| は shiftキー を押しながら ¥マーク 2 回。(Mac)
論理演算値truefalse
&&true && truetrue && false
false && true
false && false
||true || true
true || false
false || true
false || false
!! false! true

論理演算子を使った例

&& (and)

&& は、〜かつ〜 という意味で、論理積とも言います。左辺と右辺の値がどっちも true であれば true、どちらかが false、または両方 false であれば false になる演算子です。

//定数a,b,cにそれぞれtrueかfalseを代入
let a = true
let b = false
let c = true
var d:Bool

//&&
d = a && b //false
d = a && c //true

&&
左辺と右辺がどっちも true の場合のみ true になる演算子なので a && bfalse で、a && ctrue という結果になります。

|| (or)

|| は、〜または〜 という意味で、論理和とも言います。左辺と右辺どちらかが true であれば true、両方 false の場合のみ false になる演算子です。

//定数a,b,cにそれぞれtrueかfalseを代入
let a = true
let b = false
let c = true
var d:Bool

//||
d = a || b
print(d) //true
d = a || c
print(d) //true
d = b || b
print(d) //false

||
左辺か右辺の値がどちらかでも true であれば true になる演算子なので、b || bfalse、それ以外は true という結果になります。

! (not)

! は、〜でない という意味で、否定とも言います。Bool値の前に ! を付けることで、true を false に、false を true に変える事ができる演算子です。

//定数a,b,cにそれぞれtrueかfalseを代入
let a = true
let b = false
let c = true
var d:Bool

//!
d = !a
print(d) //false
d = !b
print(d) //true

!
a に入っている値は true ですが、! a とすると false に変わっています。

logical-operatorコードimg

以上 論理演算子 についてでした。
結構よく使うので押さえておきたいポイントだと思います。

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

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

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

【Swift】真理値型と比較演算子

前回は文字列型と文字列の型変換について記事を書きました。今回は真理値型と比較演算子について書いていこうと思います。
真理値型は真偽値型やBool型とも言われていて、真を表すtrueか偽を表すfalseかのどちらかの値をとる事が出来る型です。

前回は 文字列型と文字列の型変換 について記事を書きました。

今回は 真理値型と比較演算子 について書いていこうと思います。

真理値型とは

真理値型は、真偽値型や Bool型 とも言われていてを表す true か、を表す false かのどちらかの値をとる事が出来る型です。
プログラムの中で、ある条件や命題によって分岐して処理を分けたい時などに欠かせない型です。比較演算子と組み合わせて使うことで、例えばボタンの on/off 切り替えだったり、この条件であればこの処理、この条件でなければ別の処理、みたいな使い方も出来ます。まずは比較演算子の種類を見ていきましょう。

比較演算子の種類

a の値と b の値を比較した時の例

比較演算子truefalse
>a > ba が b より大きいa が b より小さい
<a < ba が b より小さいa が b より大きい
>=a >= ba が b 以上a が b 以下
<=a <= ba が b 以下a が b 以上
==a == ba が b と等しいa が b と等しくない
!=a != ba が b と等しくないa が b と等しい

上記の条件によって truefalse の値が返ってきます。

Bool型の宣言例と比較演算子を使った例

Bool型 の宣言と比較演算子を使って比較してみます。

> (大なり)

//Bool型の宣言例
var trueOrFalse:Bool
print(type(of: trueOrFalse)) //Bool

var a = 1
var b = 2

// >
trueOrFalse = a > b
print(trueOrFalse) //false

a > b
ab より大きければ true、ab より小さければ false になります。この場合は ab より小さいので結果は false になります。

< (小なり)

var trueOrFalse:Bool
print(type(of: trueOrFalse)) //Bool

var a = 1
var b = 2

// <
trueOrFalse = a < b
print(trueOrFalse) //true

a < b
ab より小さければ true、ab より大きければ false になります。この場合は ab より小さいので結果は true になります。

>= (大なりイコール)

var trueOrFalse:Bool
print(type(of: trueOrFalse)) //Bool

var a = 1
var b = 2

// >=
trueOrFalse = a >= b
print(trueOrFalse) //false

a >= b
ab 以上だったら true、ab 以下だったら false になります。この場合は ab 以下なので結果は false になります。

<= (小なりイコール)

var trueOrFalse:Bool
print(type(of: trueOrFalse)) //Bool

var a = 1
var b = 2

// <=
trueOrFalse = a <= b
print(trueOrFalse) //true

a <= b
ab 以下だったら true、ab 以上だったら false になります。この場合は ab 以下なので結果は true になります。

== (イコール)

var trueOrFalse:Bool
print(type(of: trueOrFalse)) //Bool

var a = 1
var b = 2

// ==
trueOrFalse = a == b
print(trueOrFalse) //false

a == b
ab と等しかったら true、ab と等しくなかったら false になります。この場合は ab と等しくないので結果は false になります。

!= (ノットイコール)

var trueOrFalse:Bool
print(type(of: trueOrFalse)) //Bool

var a = 1
var b = 2

// !=
trueOrFalse = a != b
print(trueOrFalse) //true

a != b
ab と等しくなかったら true、ab と等しかったら false になります。この場合は ab と等しくないので結果は true になります。

Boolコードimg

以上の 6 種類がよく使われる 比較演算子 かと思います。

次回は 論理演算子 について書いていこうと思います。

実行環境

version
Xcode 14.2 (14C18)
Swift 5.2.4

公式ドキュメント

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