from Minority

〜log

制御構造

昔の人が言っていた。
プログラミングは「代入」「分岐」「ループ」だと。

それらは制御構造。

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軸や範囲指定のイメージ図
    f:id:ryuseism:20150701234801p:plain

ヒント:ゲーム制作では、このような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を抜けるんだよ
    }
  }
}