2016-05-10 14 views
5

Sto riscontrando un cambiamento nel codice swift che non capisco.Non è possibile formare intervallo con end <start Controllare l'intervallo prima di eseguire il ciclo?

var arr = [] 
for var i = 1; i <= arr.count; i += 1 
{ 
    print("i want to see the i \(i)") 
} 

Ho un programma che ottiene un array di risultati che può anche essere vuoto. Questo non è un problema con il ciclo for sopra. Ora apple vuole che cambi il codice nel seguente modo. Ma questo si bloccherà se l'array è vuoto.

var arr = [] 
for i in 1...arr.count 
{ 
    print("i want to see the i \(i)") 
} 

Devo davvero controllare l'intervallo prima di eseguire un ciclo come?

var arr = [] 
if (arr.count >= 1){ 
    for i in 1...arr.count 
    { 
     print("I want to see the i \(i)") 
    } 
} 

C'è una soluzione più intelligente?

+7

sicuramente si desidera '0 .. Hamish

+2

... e questo risolve anche il tuo problema dato che' 0 .. <0' è un intervallo vuoto in modo che il tuo corpo del ciclo non venga inserito. – vacawama

+3

... ed è fondamentalmente a pagina 2 del manuale di Swift: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097 -CH6-ID60 – Eiko

risposta

11

Se si desidera eseguire l'iterazione su una raccolta, utilizzare la sintassi for <element> in <collection>.

for element in arr { 
    // do something with element 
} 

Se hai bisogno anche accesso al indice dell'elemento ad ogni iterazione, è possibile utilizzare enumerate(). Poiché gli indici sono a base zero, l'indice avrà l'intervallo 0..<arr.count.

for (index, element) in arr.enumerate() { 

    // do something with index & element 

    // if you need the position of the element (1st, 2nd 3rd etc), then do index+1 
    let position = index+1 
} 

È sempre possibile aggiungere un all'indice ad ogni iterazione per accedere alla posizione (per ottenere una gamma di 1..<arr.count+1).

Se nessuno di questi risolve il problema, è possibile utilizzare la gamma 0..<arr.count per scorrere gli indici dell'array, o come @vacawama says, è possibile utilizzare la gamma 1..<arr.count+1 per scorrere i posizioni.

for index in 0..<arr.count { 

    // do something with index 
} 

for position in 1..<arr.count+1 { 

    // do something with position 
} 

0..<0 non può dormire per un array vuoto come 0..<0 è solo un campo a vuoto, e 1..<arr.count+1 non può dormire per un array vuoto come 1..<1 è anche un campo a vuoto.

Vedere anche @vacawama's comment below sull'utilizzo di stride per eseguire in sicurezza più intervalli personalizzati. Ad esempio (Swift 2 sintassi):

let startIndex = 4 
for i in startIndex.stride(to: arr.count, by: 1) { 
    // i = 4, 5, 6, 7 .. arr.count-1 
} 

Swift 3 sintassi:

for i in stride(from: 4, to: arr.count, by: 1) { 
    // i = 4, 5, 6, 7 .. arr.count-1 
} 

Qui startIndex è il numero per iniziare la distanza alla, arr.count è il numero che la gamma rimarrà sotto, e 1 è la lunghezza del passo. Se il tuo array ha meno elementi del dato indice iniziale, il ciclo non verrà mai inserito.

+2

Un infine, se il tuo valore iniziale fosse stato 5 per esempio, 'per var i = 5 ; i <= arr.count; i + = 1' quindi 'stride' è la tua risposta:' per i in 5.stride (tramite: arr.count, di: 1) '. – vacawama

+0

@vacawama Yup, un altro modo pulito per fare in modo sicuro un intervallo personalizzato. L'ho incluso nella mia risposta :) – Hamish

+0

'stride (through: by:)' includerà il valore 'through'. Usa 'stride (to: by:)' per restare sotto. – vacawama

1

Questo dovrebbe produrre gli stessi risultati come primo esempio, senza errori ...

var arr = [] 
var i=1 
for _ in arr 
{ 
    print("i want to see the i \(i)") 
    i += 1 
} 

... anche se questo sembra come un modo complicato per contare gli elementi di un array (arr.count) quindi sospetto che ci sia molto di più in questa domanda che l'occhio.

3

La soluzione più ovvia in questo caso sarebbe:

var arr = [] 
for i in arr.indices { 
    print("I want to see the i \(i)") // 0 ... count - 1 
    print("I want to see the i \(i + 1)") // 1 ... count 
} 

ma leggere attentamente originaluser2's answer

Problemi correlati