サーチ…


構文

  • 定数の定数{ステートメント}
  • 条件式{ステートメント}
  • 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
2.1 2.2

配列の各要素のインデックスが必要な場合は、 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持つ要素のペアを含むレイジーシーケンスを返します。したがって、配列の場合、これらの数値は各要素の指定されたインデックスに対応しますが、これは他の種類のコレクションでは当てはまりません。

3.0

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.

逆の反復

2.1 2.2

SequenceTypereverse()メソッドを使用すると、任意のシーケンスを逆順に反復処理できます。

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
3.0

Swift 3では、 reverse()名前がreversed()変更されました:

for i in (0..<3).reversed() {
    print(i)
}

カスタムストライドで範囲を反復する

2.1 2.2

Strideablestride(_:_:)メソッドを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
1.2 3.0

Swift 3では、 Stridablestride(_:_:)メソッドがグローバル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ループ

  1. 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
  1. 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)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow