1. ホーム
  2. swift

[解決済み] Swiftのリバースレンジ

2022-09-12 21:47:58

質問

Swiftで逆レンジを扱う方法はありますか?

例えば

for i in 5...1 {
  // do something
}

は無限ループです。

Swiftの新しいバージョンでは、そのコードはコンパイルされますが、実行時にエラーが発生します。

致命的なエラーです。upperBound < lowerBoundでRangeを形成することができません。

私は私が使用できることを知っている 1..5 の代わりに、計算する j = 6 - i を計算し j をインデックスとして使用します。もっと読みやすいものはないかと考えていたところです。

どのように解決するのですか?

最新のSwift 3へのアップデート(Swift 4ではまだ動作します。)

を使用することができます。 reversed() メソッドを範囲

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

または stride(from:through:by:) メソッド

for i in stride(from:5,through:1,by:-1) { print(i) } // 5 4 3 2 1

stide(from:to:by:) は似ていますが、最後の値を除いたものです。

for i in stride(from:5,to:0,by:-1) { print(i) } // 5 4 3 2 1

最新のSwift 2へのアップデート

まず、プロトコルの拡張により reverse がどのように使われるかが変わります。

for i in (1...5).reverse() { print(i) } // 5 4 3 2 1

Stride は Xcode 7 Beta 6 で作り直されました。新しい使い方は

for i in 0.stride(to: -8, by: -2) { print(i) } // 0 -2 -4 -6
for i in 0.stride(through: -8, by: -2) { print(i) } // 0 -2 -4 -6 -8

また Doubles :

for i in 0.5.stride(to:-0.1, by: -0.1) { print(i) }

ここでは、境界の浮動小数点比較に注意してください。

Swift 1.2用に初期に編集 : Xcode 6 Beta 4時点。 によって 逆レンジ はもう存在しない :[

範囲を反転させるだけなら リバース 関数が必要です。

for i in reverse(1...5) { println(i) } // prints 5,4,3,2,1

投稿者 0x7fffffff 新しい ストライド が追加され、任意の整数の反復処理とインクリメントに使用できるようになりました。Apple はまた、浮動小数点のサポートが来ることを明言しています。

彼の回答からの出典です。

for x in stride(from: 0, through: -8, by: -2) {
    println(x) // 0, -2, -4, -6, -8
}

for x in stride(from: 6, to: -2, by: -4) {
    println(x) // 6, 2
}