制御構造
昔の人が言っていた。
プログラミングは「代入」「分岐」「ループ」だと。
それらは制御構造。
forループ
- forループ
for 初期化; 条件; 更新処理; { ループ処理 }
for var i: int = 0; i < 10; i++ { println(i) // 0...9が繰り返し表示 }
- for-inループ
for 変数 in 値のまとまり { // 値のまとまりを順番に変数が出力 }
for i in 1...10 { println(i) //1...10が繰り返し表示 } // このとき「i」をインデックスと呼ぶ
- インデックスの省略
for _ in 1...10 { }
- 配列をfor-inループ
let fruits = ["apple","banana","orange",] for i in fruits { }
- ディクショナリfor-inループ
var airports = ["NRT": "Narita", "HND": "Haneda",] for index in airports { index.0 // NRT, HND index.1 // Narita, Haneda }
- タプルfor-inループ
var airports = ["NRT": "Narita", "HND": "Haneda",] for (code, name) in airports { code // NRT, HND name // Narita, Haneda }
- 文字列だって
for char in "こんにちは" { char // こ,ん,に,ち,は } // 文字列の数だけループされる
while / do-while
- while
while 条件 { ループ処理 }
var index = 0 while index < 100 { index++ //0...99まで繰り返し処理 }
- do-while
while { ループ処理 } 条件
var index = 0 do { index++ //1...99まで繰り返し処理 } while index < 100 // はじめに何か処理したい時
if
- ifの条件はBool値
if 条件1 { } else if 条件2 { } else { // 条件1.2以外だったら }
条件がBoolであれば、いろいろなパターンを条件に指定可
switch-case
switch 評価する値 { case 値1 : case 値2, 値3 : // case節は1つマッチすると以降のcaseは評価しない為、複数指定 case 値4 : default : 上記ケースに該当しない場合の処理 } // breakは省略可能。利用も可能。
// ifとの使い分け勘所は、switchは評価するすべての値をカバーする必要がある
- 範囲に対するマッチ
let hour = 15 switch hour { case 10...12, 13...19 : println("営業時間内") default : println("営業時間外") }
- タプルに対するマッチ
let point = (40, 0) switch point { case (0, 0) : // この指定は完全一位 println("センターマーク上") case (0, _) : // X軸の要素一致と、Y軸「_」はなんでもOK println("センターライン上") case (_, 32) (_, -32) : println("タッチライン上") case (-50...(-34), -16...16), (34...50, -16...16) : // X軸, Y軸を範囲指定している println("ペナルティーエリア内") default : println("それ以外のフィールド") } // タプル(X軸, Y軸)で考える
- X軸, Y軸や範囲指定のイメージ図
ヒント:ゲーム制作では、このようなX軸, Y軸などの空間を利用して当たり判定したりしなかったり。
- 値のバインディング
let point = (0, -20) switch point { case (0, let y) : println("センターライン上") if y > 0 { println("北側") } else { println("南側") } default : println("それ以外のフィールド") }
- 条件付きcase
let point = (0, -20) switch point { case (0, let y) where y > 0 : println("センターライン上 北側") case (0, let y) where y < 0 : println("センターライン上 南側") case (0, _) : println("センターライン上") default : println("それ以外のフィールド") }
フロー制御命令
- continue(スキップして次のループ処理へ)
let arr = 1...100 for index in arr { if index % 2 == 1 { continue } println("\(index)は偶数") }
- break(処理を抜ける)
let haystack = ["Mercury","Venus","Earth","Mars",] let needle = "Earth" for word in haystack { if word == needle { println("\(needle) found") break; } }
- fallthrough(caseマッチ後も後続処理実行)
let number = 10 switch munber { case 1...10 : println("1以上10以下の") fallthrough default : println("整数") }
- ラベル付き命令(フロー制御命令の対象を指定)
loop1 : for var idx1 = 0; idx1 < 10; idx1++ { loop2 : for var idx2 = 0; idx2 < 10; idx2++ { println("idx1: \(idx1) idx2: \(idx2)") if edx1 == 4 && idx2 == 4 { break loop1 // このbreakは、loop1を抜けるんだよ } } }