web-dev-qa-db-ja.com

Swift非推奨のCスタイルループの後のループでインデックスをデクリメントします

Swift 3.0では、以下の構文はもはや有効ではありませんが、減少するインデックス付きループをどのように表現しますか?

for var index = 10 ; index > 0; index-=1{
   print(index)
}

// 10 9 8 7 6 5 4 3 2 1
37
netshark1000

これは、より簡単な(そしてより迅速な)アプローチです。

for i in (0 ..< 5).reversed() {
    print(i) // 4,3,2,1,0
}

let array = ["a", "b", "c", "d", "e"]
for element in array.reversed() {
    print(element) // e,d,c,b,a
}

array.reversed().forEach { print($0) } // e,d,c,b,a

print(Array(array.reversed())) // e,d,c,b,a
45
Jonny

インクリメントまたはデクリメントが固定されたCスタイルのループは、 stride() で置き換えることができます。

_for index in 10.stride(to: 0, by: -1) {
    print(index)
}

// 10 9 8 7 6 5 4 3 2 1
_

最後の要素を含めるかどうかに応じて、stride(to: ...)またはstride(through: ...)を使用します。

これはSwiftの場合です2. Swift 3の構文が(再び)変更されました( this answer

48
Martin R

_Swift 3.0_から、Strideableのstride(to:by:)メソッドは、フリー関数stride(from:to:by:)に置き換えられました

_ for index in stride(from: 10, to: 0, by: -1){
      print(index)
 }
_
21
EI Captain v2.0

strideメソッドを使用できます:

10.stride(through: 0, by: -1).forEach { print($0) }

または古典的なwhileループ。

10

それでもこのCスタイルのループを使用したい場合は、次のものが必要です。

let x = 10

infix operator ..> { associativity left }
func ..>(left: Int, right: Int) -> StrideTo<Int> {
    return stride(from: left, to: right, by: -1)
}

for i in x..>0 {
    print(i)
}
1
ielyamani