制御フロー

For-Inループ

for– inループを使用して、配列の項目、数値の範囲、文字列の文字などのシーケンスを反復処理します。

// for-in 配列
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    print("Hello, \(name)!")
}

// for-in 辞書 
// 取得される順序は保証されません
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    print("\(animalName)s have \(legCount) legs")
}

// for- in数値範囲
for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}
// 上記の例でindexは、は定数であり、その値はループの各反復の開始時に自動的に設定されます。そのため、index使用前に宣言する必要はありません。let宣言キーワードを必要とせずに、ループ宣言に含めるだけで暗黙的に宣言されます。

// シーケンスの各値が必要ない場合、変数名の代わりにアンダースコアを使用して値を無視できます。
for _ in 1...5 {
    print("Hello")
}

// 半開範囲演算子で for-in
let minutes = 60
for tickMark in 0..<minutes {
    // render the tick mark each minute (60 times)
}

// for-in-stride(from:, to:, by) 
let minuteInterval = 5
for tickMark in stride(from: 0, to: minutes, by: minuteInterval) {
    // render the tick mark every 5 minutes (0, 5, 10, 15 ... 45, 50, 55)
}

// for-in-stride(from:, through:, by) 閉じた範囲
let hours = 12
let hourInterval = 3
for tickMark in stride(from: 3, through: hours, by: hourInterval) {
    // render the tick mark every 3 hours (3, 6, 9, 12)
}

ループ

Swiftには2種類のwhileループがあります。

  • while ループの各パスの開始時にその状態を評価します。
  • repeat– whileループを通過する各パスの終わりにその状態を評価します。

while

while condition {
    statements
}

repeat-while

repeat {
    statements
} while condition

条件文

Swiftには、コードに条件分岐を追加する2つの方法があります。ifステートメントとswitchステートメントです。

if

temperatureInFahrenheit = 90
if temperatureInFahrenheit <= 32 {
    print("It's very cold. Consider wearing a scarf.")
} else if temperatureInFahrenheit >= 86 {
    print("It's really warm. Don't forget to wear sunscreen.")
} else {
    print("It's not that cold. Wear a t-shirt.")
}

switch

switch some value to consider {
case value 1:
    respond to value 1
case value 2,
     value 3:
    respond to value 2 or 3
default:
    otherwise, do something else
}

暗黙のフォールスルーなし

Swiftのステートメントは、各ケースの最下部をfall through せず、次のケースにすすみません。switchでは、明示的なbreakステートメントを必要とせずに、最初の一致するケースが完了するとすぐに実行を終了します。これにより、switchステートメントがC のステートメントよりも安全で使いやすくなり、誤って複数のケースを実行することが回避されます。break は、Swiftでは必要とされていませんが、使用することができます。

各ケースの本文には、少なくとも1つの実行可能ステートメントが含まれている必要あります。

switch anotherCharacter {
case "a": // 実行文がないため、エラーになる
case "A":
    print("The letter A")
default:
    print("Not the letter A")
}

このような場合は、次のように、ケースをコンマで区切ります。
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}

switchで、特定のケースの最後に明示的にフォールスルーするには、fallthroughキーワードを使用します。

インターバルマッチング

ケースの値は、interval に含まれているかどうかを確認できます。

switch approximateCount {
  case 0:
    naturalCount = "no"
  case 1..<5:
    naturalCount = "a few"
  case 5..<12:
    naturalCount = "several"
  default:
     naturalCount = "many"
}

タプル

タプルを使用して、同じステートメントで複数の値をテストできます。タプルの各要素は、異なる値または値の間隔に対してテストできます。または、アンダースコア文字を使用して、可能な値と一致させます。

let somePoint = (1, 1)
switch somePoint {
  case (0, 0):
    print("\(somePoint) is at the origin")
  case (_, 0):
    print("\(somePoint) is on the x-axis")
  case (0, _):
    print("\(somePoint) is on the y-axis")
  case (-2...2, -2...2):
    print("\(somePoint) is inside the box")
  default:
    print("\(somePoint) is outside of the box")
}

value binding

case内で、一時的な定数や変数に一致する値に名前を付けることができます。この動作はvalue vindingと呼ばれます

let anotherPoint = (2, 0)
switch anotherPoint {
  case (let x, 0):
    print("on the x-axis with an x value of \(x)")
  case (0, let y):
    print("on the y-axis with a y value of \(y)")
  case let (x, y):
    print("somewhere else at (\(x), \(y))")
}

where

switchでは、where で条件をチェックする句を追加できる。

let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
  case let (x, y) where x == y:
    print("(\(x), \(y)) is on the line x == y")
  case let (x, y) where x == -y:
    print("(\(x), \(y)) is on the line x == -y")
  case let (x, y):
    print("(\(x), \(y)) is just some arbitrary point")
}

複合case

// case では、複数の値をコンマで記述することができます
// リストが長い場合、パターンは複数行に渡って記述できます
switch someCharacter {
  case "a", "e", "i", "o", "u":
    print("\(someCharacter) is a vowel")
  case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
            "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
    print("\(someCharacter) is a consonant")
  default:
    print("\(someCharacter) is not a vowel or a consonant")
}

// value binding の場合
switch stillAnotherPoint {
  case (let distance, 0), (0, let distance):
    print("On an axis, \(distance) from the origin")
  default:
    print("Not on an axis")
}

Control Transfer 文

Control Transfer 文は、あるコードから別のコードに制御を転送することにより、コードが実行される順序変更します。Swiftには5つの制御転送ステートメントがあります。

  • continue
  • break
  • fallthrough
  • return
  • throw

continue

continue文は、ループに実行中の処理を停止し、ループの次の反復の開始時に再び開始するように指示します。

let puzzleInput = "great minds think alike"
var puzzleOutput = ""
let charactersToRemove: [Character] = ["a", "e", "i", "o", "u", " "]
for character in puzzleInput {
  if charactersToRemove.contains(character) {
    continue
  }
  puzzleOutput.append(character)
}
print(puzzleOutput)
// Prints "grtmndsthnklk"

break

breakステートメントは、制御フローステートメント全体の実行をすぐに終了します。

ループ文内の break文

ループステートメント内で break を使用すると、ループの実行がすぐに終了し、ループの閉じ中かっこの後に制御がコードに移ります。

switchステートメントの中断

switch 内部で使用する場合、すぐにその実行を終了し、} 後のコードに制御を写す。

let numberSymbol: Character = "三" // Chinese symbol for the number 3
var possibleIntegerValue: Int?
switch numberSymbol {
  case "1", "١", "一", "๑":
    possibleIntegerValue = 1
  case "2", "٢", "二", "๒":
    possibleIntegerValue = 2
  case "3", "٣", "三", "๓":
    possibleIntegerValue = 3
  case "4", "٤", "四", "๔":
    possibleIntegerValue = 4
  default:
    break
}
if let integerValue = possibleIntegerValue {
  print("The integer value of \(numberSymbol) is \(integerValue).")
} else {
  print("An integer value could not be found for \(numberSymbol).")
}
// Prints "The integer value of 三 is 3."

fallthrough

Swiftでは、switchステートメントが各ケースの下部から次のケースに落ちることはありません。つまりswitch、最初の一致するケースが完了するとすぐに、ステートメント全体が実行を完了します。対照的に、Cでは、フォールスルーを防ぐためにbreak、すべてのswitchケースの最後に明示的なステートメントを挿入する必要があります。これにより、誤って複数のケースを実行することを回避します。

Cスタイルのフォールスルー動作が必要な場合は、fallthroughキーワードを使用します。

let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
  case 2, 3, 5, 7, 11, 13, 17, 19:
    description += " a prime number, and also"
    fallthrough
  default:
    description += " an integer."
}
print(description)
// Prints "The number 5 is a prime number, and also an integer."

注意

このfallthroughキーワードは、実行に該当するケースのケース条件をチェックしません。これは、c言語と同じ振る舞いです。

ラベル付きステートメント

label name: while condition {
    statements
}

// 例
gameLoop: while square != finalSquare {
    diceRoll += 1
    if diceRoll == 7 { diceRoll = 1 }
    switch square + diceRoll {
      case finalSquare:
          // gameLoop を終わらせる
         break gameLoop 
      case let newSquare where newSquare > finalSquare:
         // gameLoop を続ける
        continue gameLoop
    default:
        break
   }
}

注意

上記の例で、ラベルを使用しなかった場合、switch の break, continue として扱われる。ラベルを使用すると、終了する必要のある制御ステートメントが明確になります。

早期終了

guardステートメントの後のコードを実行するためには、guard 条件が真でなければならない。if文とは異なり、guard文には常にelse句があります。条件が真でない場合、句内のコードが実行されます。

 func guardTest(status: Int) {
    guard status == 0 else { return }
    print("status == 0 である")
}

guardステートメントがコードブロックを終了するために、returnbreakcontinue、またはthrow、fatalError(_:file:line:)のような、関数やメソッドを呼び出すことができる。
また、早期終了処理は、if文で書くより可読性が良い。

APIの可用性の確認

APIの可用性を確認するためのサポートが組み込まれているため、特定のデプロイメントターゲットで使用できないAPIを誤って使用することはありません。

コンパイラーはSDKの可用性情報を使用して、コードで使用されているすべてのAPIが、プロジェクトで指定されたデプロイメントターゲットで使用できることを確認します。利用できないAPIを使おうとすると、Swiftはコンパイル時にエラーを報告します。

if または guard文で、使用するAPIが実行時に使用できるかどうかに応じて、コードブロックを条件付きで実行できる。

if #available(iOS 10, macOS 10.12, *) {
    // iOS では10以降のみ、macOSでは 10.12以降のみ、及びそれ以外のプラットフォーム
} else {
    // Fall back to earlier iOS and macOS APIs
}

投稿者: admin

Free Software Engineer

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です