Swift Language
ループ
サーチ…
構文
- 定数の定数{ステートメント}
- 条件式{ステートメント}
- for {ステートメント}のvar変数
- for _ in sequence {ステートメント}
- の場合は、シーケンスの定数{ステートメント}
- ケースの場合、定数{const}
- case {ステートメント}変数の場合
- 条件{ステートメント}
- 条件中に{statements}を繰り返します。
- sequence.forEach(body:(Element)throws - > void)
For-inループ
for-inループでは、どのシーケンスでも反復処理が可能です。
ある範囲で反復する
ハーフオープンとクローズの両方の範囲で反復処理を行うことができます。
for i in 0..<3 {
print(i)
}
for i in 0...2 {
print(i)
}
// Both print:
// 0
// 1
// 2
配列または集合を反復する
let names = ["James", "Emily", "Miles"]
for name in names {
print(name)
}
// James
// Emily
// Miles
配列の各要素のインデックスが必要な場合は、 SequenceType
enumerate()
メソッドを使用できます。
for (index, name) in names.enumerate() {
print("The index of \(name) is \(index).")
}
// The index of James is 0.
// The index of Emily is 1.
// The index of Miles is 2.
enumerate()
は、0から始まる連続したInt
持つ要素のペアを含むレイジーシーケンスを返します。したがって、配列の場合、これらの数値は各要素の指定されたインデックスに対応しますが、これは他の種類のコレクションでは当てはまりません。
Swift 3では、 enumerate()
名前がenumerated()
変更されました。
for (index, name) in names.enumerated() {
print("The index of \(name) is \(index).")
}
辞書の繰り返し
let ages = ["James": 29, "Emily": 24]
for (name, age) in ages {
print(name, "is", age, "years old.")
}
// Emily is 24 years old.
// James is 29 years old.
逆の反復
SequenceType
でreverse()
メソッドを使用すると、任意のシーケンスを逆順に反復処理できます。
for i in (0..<3).reverse() {
print(i)
}
for i in (0...2).reverse() {
print(i)
}
// Both print:
// 2
// 1
// 0
let names = ["James", "Emily", "Miles"]
for name in names.reverse() {
print(name)
}
// Miles
// Emily
// James
Swift 3では、 reverse()
名前がreversed()
変更されました:
for i in (0..<3).reversed() {
print(i)
}
カスタムストライドで範囲を反復する
Strideable
のstride(_:_:)
メソッドをStrideable
すると、カスタムストライドを使用して範囲を反復処理できます。
for i in 4.stride(to: 0, by: -2) {
print(i)
}
// 4
// 2
for i in 4.stride(through: 0, by: -2) {
print(i)
}
// 4
// 2
// 0
Swift 3では、 Stridable
のstride(_:_:)
メソッドがグローバルstride(_:_:_:)
関数に置き換えられました。
for i in stride(from: 4, to: 0, by: -2) {
print(i)
}
for i in stride(from: 4, through: 0, by: -2) {
print(i)
}
リピートループ
whileループと同様に、制御文だけがループの後に評価されます。したがって、ループは常に少なくとも1回実行されます。
var i: Int = 0
repeat {
print(i)
i += 1
} while i < 3
// 0
// 1
// 2
whileループ
while
ループは条件が真である限り実行されます。
var count = 1
while count < 10 {
print("This is the \(count) run of the loop")
count += 1
}
各ブロックのシーケンスタイプ
SequenceTypeプロトコルに準拠する型は、クロージャ内の要素を反復処理できます。
collection.forEach { print($0) }
名前付きパラメータでも同じことができます:
collection.forEach { item in
print(item)
}
*注:これらのブロックでは、制御フロー文(ブレークや継続など)は使用できません。 returnを呼び出すことができ、呼び出された場合、現在の反復のブロックをすぐに返します(continueと同じように)。次の反復が実行されます。
let arr = [1,2,3,4]
arr.forEach {
// blocks for 3 and 4 will still be called
if $0 == 2 {
return
}
}
フィルタリングを伴うFor-inループ
-
where
節
where
句を追加することで、反復を指定された条件を満たすものに限定することができます。
for i in 0..<5 where i % 2 == 0 {
print(i)
}
// 0
// 2
// 4
let names = ["James", "Emily", "Miles"]
for name in names where name.characters.contains("s") {
print(name)
}
// James
// Miles
-
case
節
これは、あるパターンに一致する値だけを反復処理する必要がある場合に便利です。
let points = [(5, 0), (31, 0), (5, 31)]
for case (_, 0) in points {
print("point on x-axis")
}
//point on x-axis
//point on x-axis
また、オプションの値をフィルタリングし、必要に応じてそれらをアンラップすることもできます?
バインディング定数の後のマーク:
let optionalNumbers = [31, 5, nil]
for case let number? in optionalNumbers {
print(number)
}
//31
//5
ループを壊す
ループは条件が真のままであれば実行されますが、 break
キーワードを使用して手動で停止することができます。例えば:
var peopleArray = ["John", "Nicole", "Thomas", "Richard", "Brian", "Novak", "Vick", "Amanda", "Sonya"]
var positionOfNovak = 0
for person in peopleArray {
if person == "Novak" { break }
positionOfNovak += 1
}
print("Novak is the element located on position [\(positionOfNovak)] in peopleArray.")
//prints out: Novak is the element located on position 5 in peopleArray. (which is true)