2016-11-13 14 views
0

私は速い構文(.enumerate()と.revers()を使用して)forループを書く方法を理解していますが、私は複数の条件を遵守することを考慮して、forループのjavascriptバージョン:Swift 3.0ループのCスタイルの複数の条件

for(var j = 10; j >= 0 && array[j] > value; j--) { 
    array[j + 1] = array[j]; 
} 
+3

あなたは常に' while'ループに頼ることができます... –

答えて

2

これはどうでしょうか?私は個人的にforを使用することを好む(

for j in (0...10).reversed() { 
    guard array[j] > value else { break } 
    array[j + 1] = array[j] 
} 
+2

注:

スイフト3.1までは、Collectionprefix(while:)を取得するには、以下の拡張機能を使用することができます*ループを終了させる*。これはここでは関係ないかもしれませんが、 "大きな"反復範囲に違いがあります。 –

+0

@MartinR:そうです、コードを更新しました。ありがとうございます。 –

2

は、私はまったく同じ結果を生成することはよく分からないが、これは完成さのためにスウィフト3

for j in stride(from:10, through:0, by: -1) { 
    if array[j] <= value { break } 
    array[j + 1] = array[j] 
} 
0

でのアプローチの一つでありますSwift 3.1では要素が与えられた述語を満たしている配列の添え字の接尾辞を得るためにSequence's prefix(while:) methodを使うことができます。

var array = [2, 3, 6, 19, 20, 45, 100, 125, 7, 9, 21, 22] 

let value = 6 

for i in array.indices // the array's indices. 
    .dropLast() // exclude the last index as we'll be accessing index + 1 in the loop. 
    .reversed() // reversed so we can get the suffix that meets the predicate. 
    .prefix(while: {array[$0] > value}) // the subsequence from the start of the 
{          // collection where elements meet the predicate. 
    array[i + 1] = array[i] 
} 

print(array) // [2, 3, 6, 19, 19, 20, 45, 100, 125, 7, 9, 21] 

これは、配列の最後から2番目のインデックスで反復処理を開始しようとしていることを前提としています。あなたが特定のインデックスで開始する場合は、あなたが言うことができます。

for i in (0...10).reversed().prefix(while: {array[$0] > value}) { 
    array[i + 1] = array[i] 
} 

これは、インデックス10で開始し、あなたの質問にあなたのコードに同じ動作を与え、0にまで反復します。

上記のバリアントの両方が、逆のインデックスを(述語が満たされなくなるまで)最初に反復し、次に配列の要素を通して繰り返すことは注目に値する。 Swift 3.1には、遅いシーケンスで動作するprefix(while:)のバージョンがあります。これは、述語が満たされなくなるまで要素を1回だけ繰り返すことを可能にします。 `WHERE`状態にはないことを

extension Collection { 
    func prefix(while predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.SubSequence { 

     var index = startIndex 

     while try index < endIndex && predicate(self[index]) { 
      formIndex(after: &index) 
     } 
     return self[startIndex..<index] 
    } 
}