2016-03-24 22 views
5

Con il nuovo aggiornamento a Xcode 7.3, sono emersi molti problemi relativi alla nuova versione di Swift 3. Uno di loro dice "C-style for statement è deprecato e verrà rimosso in futuro versione di Swift "(questo appare nelle tradizionali istruzioni for).For-In Loop multiple condizioni

Uno di questi cicli ha più di una condizione:

for i = 0; i < 5 && i < products.count; i += 1 { 

} 

La mia domanda è: esiste un modo elegante (non usare break) per includere questa duplice condizione in un ciclo for-in di Swift:

for i in 0 ..< 5 { 

} 

risposta

12

sarebbe proprio come si sta dicendo che se hai descritto ad alta voce:

for i in 0 ..< min(5, products.count) { ... } 

Detto questo, ho il sospetto che davvero media:

for product in products.prefix(5) { ... } 

che è meno soggetto a errori di qualsiasi altra cosa che richiede subscripting.

E 'possibile che in realtà bisogno di un indice intero (anche se questo è raro), nel qual caso si intende:

for (index, product) in products.enumerate().prefix(5) { ... } 

Oppure si potrebbe anche ottenere un indice di vero e se si voleva con:

for (index, product) in zip(products.indices, products).prefix(5) { ... } 
+3

La tua risposta dimostra perfettamente perché Apple sta rimuovendo lo stile C 'dichiarazione for': perché ci sono altri, molto più Swifty modi per realizzare la stessa cosa, e spesso le persone usano solo la vecchia istruzione 'for' per iterare comunque un array. – Gavin

+0

Risposta molto completa! Grazie! con i primi due è stato sufficiente per me. Informazioni sulle ultime due risposte (che hanno entrambi errori di compilazione): nella terza risposta, enumerate è un metodo e nella quarta risposta "Valore di tipo Intervallo > non ha zip membro", quindi questo metodo sembra che non esiste per questo tipo Grazie mille! – angeldev

+0

Risolto il problema con la sintassi. Grazie per averlo notato –

4

Un altro modo per farlo sarebbe come questo

for i in 0 ..< 5 where i < products.count { 
} 
9

È possibile utilizzare && oper ator con where condizione come

let arr = [1,2,3,4,5,6,7,8,9] 

for i in 1...arr.count where i < 5 { 
    print(i) 
} 
//output:- 1 2 3 4 

for i in 1...100 where i > 40 && i < 50 && (i % 2 == 0) { 
    print(i) 
} 
//output:- 42 44 46 48 
+0

Grazie! Ha risolto il mio problema. – Raja

-1

Ecco una soluzione semplice:

var x = 0 
while (x < foo.length && x < bar.length) { 

    // Loop body goes here 

    x += 1 
}