web-dev-qa-db-ja.com

なぜ私のSwiftループはエラー「終了<開始で範囲を形成できません」で失敗しますか?

数値が数値の因子であるかどうかをチェックし、その因子が素数であるかどうかをチェックし、それを配列に追加するforループがあります。元の番号に応じて、エラーが表示されます

致命的なエラー:終了<開始で範囲を形成できません

これはほぼ毎回発生しますが、一部の数値では正常に機能します。動作することがわかっているのは、9、15、および25だけです。

コードは次のとおりです。

let num = 16 // or any Int
var primes = [Int]()

for i in 2...(num/2) {

    if ((num % i) == 0) {
        var isPrimeFactor = true

        for l in 2...i-1 {
            if ((i%l) == 0) {
                isPrimeFactor = false;
            }//end if
        }//end for

        if (isPrimeFactor == true) {
            primes.append(i)
        }//end if

    }//end if

}//end for
26
lagoon

動的な値の範囲を持つループが必要な場合は、_..<_または_..._の代わりにstride(to:by:)を使用することをお勧めします

基本的に_..<_または_..._は、_start_index > end_index_の場合にクラッシュします。

例:

_let k = 5
for i in 10...k { print("i=\(i)") }
for i in 10..<k { print("i=\(i)") }
_

直し方:

_// Swift 2.3
let k = 5
for i in 10.stride(to: k+1, by: 1) { print("i=\(i)") }
for i in 10.stride(to: k, by: 1) { print("i=\(i)") }

// Swift 3.0
let k = 5
for i in stride(from: 10, through: k, by: 1) { print("i=\(i)") }
for i in stride(from: 10, to: k, by: 1) { print("i=\(i)") }
_

注:上記の2ブロック何も出力しないですが、そのうちの1つは実行時にクラッシュします。 higher numberからlower numberに変更したい場合は、byパラメーターをnegativeに変更する必要があります番号。

参照:

39
nahung89

2番目のループでは、iは常に2から始まります。つまり、2...1

9
chris

SWIIFT 4

最適な方法は、このドキュメントページのようにストライドを使用することです。 Generic Function stride(from:to:by:)

for i in stride(from: 10, through: 5, by: -1) { print(i) }

lowerBoundを含める場合は、ストライドスルーします。 Generic Function stride(from:through:by:)

0
Wissa