2015-02-22 16 views
16

Ho un ciclo for che controlla se un numero è un fattore di un numero, quindi controlla se quel fattore è primo, e quindi lo aggiunge a un array. A seconda del numero originale, verrà visualizzato un messaggio di errorePerché il mio loop Swift non funziona con errore "Non è possibile creare un intervallo con end <start"?

fatal error: Can't form range with end < start

Questo succede quasi ogni volta, ma per alcuni numeri funziona correttamente. Gli unici numeri che ho trovato a lavorare con esso sono 9, 15, e 25.

Ecco il codice:

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 

risposta

9

Nel tuo secondo ciclo, i partirà sempre alle 2, che significa' re loop da 2...1

+0

Ma come mai funziona con alcuni numeri e non altre? – lagoon

+2

questi tre numeri sono dispari quindi la condizione 'num% i' è falsa. – chris

+0

Quindi come risolverei questo? Se lo avvio a 1 allora non aggiunge nulla a "primes" – lagoon

26

Se avete bisogno di un ciclo con valore gamma dinamica, vi suggerisco di utilizzare stride(to:by:) invece di ..< o ...

Fondamentalmente ..< o r ... verrà arrestato se start_index > end_index.

Es:

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

come risolvere il problema:

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

Nota: 2 blocchi sopra non stampare nulla, ma uno di loro saranno schiantato durante l'esecuzione.

Riferimento:

+3

"di" parametro deve essere (-1) o nulla verrà stampato – igrrik

+1

@igrrik: Si prega di leggere attentamente. Stiamo parlando dell'errore fatale causato da .. nahung89