Swift
swift4

SwiftTourをさっと読む ~Control Flow ~

Swift4ツアーをさっと読む ~ Control Flow ~

前回に続いて今日はControl Flow。制御文のことですね。
さっと見ていきます。

一覧

  • 条件分岐
    • if文
    • switch文
  • 繰り返し
    • for-in文
    • while文
    • repeat-while

条件分岐

if文

基本的な形

if文
  var age = 20
  if age >= 60 {
    print("Elder")
  } else if age >= 20 {
    print("Adult")
  } else {
    print("Child")
  }

条件式は必ずBooleanでなければならず、
暗黙での0との比較は行われない。エラーとなる。

if-let

if-let文
  var optionalName: String? = "haxpig"
  var greeting = "Hello!"
  if let name = optionalName {
    greeting = "Hello, \(name)"
  }
  print(greeting) // "Hello, haxpig"

if-let文を用いるとOptional Bindingすることができる。
簡単に言えば、変数optionalNameに値が設定されていれば後続の処理が実行され、スコープ内ではアンラップされた状態で利用ができる。

Optionalについてはまたの機会。

デフォルト値の利用
デフォルト値の利用
  let nickName: String? = nil
  let fullName: String = "haxpig"
  let greeting = "Hi \(nickName ?? fullName)"
  print(greeting) // "Hi haxpig"

Optionalの変数に続けて?? デフォルト値で値がない場合のデフォルト値を設定できる。
(なんでここで紹介されてるのだろう。)

switch文

switchの基本
  switch 比較対象 {
  case パターン1: 処理
  case パターン2: 処理
  default: 処理
  }
switch文サンプル
  let vegetable = "red pepper"
  switch vegetable {
  case "celery":
      print("Add some raisins and make ants on a log.")
  case "cucumber", "watercress":
      print("That would make a good tea sandwich.")
  case let x where vegetable.hasSuffix("pepper"):
      print("Is it a spicy \(x)?")
  default:
      print("Everything tastes good in soup.")
  }

いずれかのパターンに合致した場合、その処理が行われ、後続のパターン処理は実行されないので、breakは不要。
(ただし、処理文がない場合breakが必要)

パターンを複数指定したい場合は、カンマ区切り(,)で記述できる。

case内のパターン指定にwhereを利用できる

defaultは必須。
(ただしenumで全パターンを網羅している場合は不要)

繰り返し

for-in文

配列を回す

配列を回す
  let individualScores = [75, 43, 103, 87, 12]
  var teamScore = 0
  for score in individualScores {
      if score > 50 {
          teamScore += 3
      } else {
          teamScore += 1
      }
  }
  print(teamScore)

要素数だけ繰り返す。

辞書を回す

辞書を回す
  let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
  ]
  var largest = 0
  for (kind, numbers) in interestingNumbers {
    for number in numbers {
      if number > largest {
        largest = number
      }
    }
  }
  print(largest)

key-valueをペアで取り出し、繰り返すことができる。

while文

while文

while文
  var n = 2
  while n < 2 {
    n *= 2
  }
  print(n) // 2

条件に合致するまで繰り返す。
処理開始時にも判定する。

repeat-while文

repeat-while文
  var m = 2
  repeat {
    m *= 2
  } while m < 2
  print(m) // 4

他言語で言うところのdo-while
処理実行後に判定が行われるため、少なくとも一回実行される。

インデックス範囲の指定方法

x..<y x以上y未満
x...y x以上y以下

おわり

if-letrepeat-whileが一瞬「お?」となりましたが、読めばなるほどですね。
何か間違いがあればご指摘お願い致します。

おしまい。