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
ステートメントがコードブロックを終了するために、return
、break
、continue
、または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 }