数値が数値の因子であるかどうかをチェックし、その因子が素数であるかどうかをチェックし、それを配列に追加する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
動的な値の範囲を持つループが必要な場合は、_..<
_または_...
_の代わりに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に変更する必要があります番号。
参照:
2番目のループでは、i
は常に2から始まります。つまり、2...1
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:)