2016-03-24 10 views
5

Wraz z nową aktualizacją do Xcode 7.3 pojawiło się wiele problemów związanych z nową wersją Swift 3. Jedna z nich mówi: "Styl C dla instrukcji jest przestarzały i zostanie usunięty w przyszłości wersja Swift "(pojawia się w tradycyjnych instrukcjach for).For-In Loops multiple conditions

Jeden to pętle ma więcej niż jeden warunek:

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

} 

Moje pytanie brzmi, czy jest jakiś elegancki sposób (nie używać break) obejmuje ten podwójny warunek w for-w pętli Swift:

for i in 0 ..< 5 { 

} 

Odpowiedz

12

byłoby tak jak mówisz, jeśli opisane to głośno:

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

Powiedział, że podejrzewasz naprawdę myśli:

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

który jest mniej podatne na błędy niż cokolwiek, co wymaga indeksowanie.

Jest możliwe, rzeczywiście trzeba indeksu całkowitą (choć zdarza się to rzadko), w tym przypadku chodziło Ci o:

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

Albo można nawet uzyskać prawdziwy indeks jeśli chciał z:

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

Twoja odpowiedź pokazuje doskonale, dlaczego Apple jest usunięcie stylu C 'for' stwierdzenie: ponieważ istnieją inne, o wiele bardziej Swifty sposoby Osiągnij to samo i często ludzie używają starej instrukcji 'for' tylko do iterowania tablicy. – Gavin

+0

Bardzo kompletna odpowiedź! Dzięki! z dwoma pierwszymi był dla mnie wystarczający. O dwóch ostatnich odpowiedziach (obie mają błędy kompilacji): w trzeciej odpowiedzi, wyliczenie jest metodą, aw czwartej odpowiedzi: "Wartość zakresu typu > nie ma zip członka", więc ta metoda wydaje się to nie istnieje dla tego typu. Dziękuję bardzo! – angeldev

+0

Naprawiono składnię. Dzięki za zwrócenie na to uwagi. –

4

Innym sposobem na to byłoby jak to

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

można wykorzystać && Oper ator z where stan jak

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

Dziękujemy! To rozwiązało mój problem. – Raja

-1

Oto proste rozwiązanie:

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

    // Loop body goes here 

    x += 1 
}