web-dev-qa-db-fra.com

Pourquoi ma boucle Swift échoue avec l'erreur "Can't form range with end <start"?

J'ai une boucle for qui vérifie si un nombre est un facteur d'un nombre, puis vérifie si ce facteur est premier, puis il l'ajoute à un tableau. Selon le numéro d'origine, j'obtiendrai une erreur disant

erreur fatale: impossible de former une plage avec fin <début

Cela se produit presque à chaque fois, mais pour certains chiffres, cela fonctionne bien. Les seuls chiffres que j'ai trouvés pour travailler avec lui sont 9, 15 et 25.

Voici le code:

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

Si vous avez besoin d'une boucle avec une plage de valeurs dynamique, je suggère d'utiliser stride(to:by:) au lieu de ..< ou ...

Fondamentalement ..< ou ... sera bloqué si start_index > end_index.

Ex:

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

Comment réparer:

// 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)") }

REMARQUE: 2 blocs au-dessus n'imprimera rien, mais l'un d'eux se bloquera lors de l'exécution. Si vous souhaitez passer d'un nombre supérieur à un nombre inférieur, le paramètre by doit être modifié en un nombre négatif .

Référence:

39
nahung89

Dans votre deuxième boucle, i commencera toujours à 2, ce qui signifie que vous bouclez depuis 2...1

9
chris

SWIIFT 4

La meilleure façon de procéder est d'utiliser stride comme sur cette page de documentation: Stride de la fonction générique (de: à: par:)

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

et avancez si vous voulez inclure la limite inférieure: enjambée de la fonction générique (de: à: par:)

0
Wissa