2016-03-26 1 views
0

Il s'agit d'un tri de bas en haut. Pendant la boucle, l'itération est substituée par le nombre le plus bas dans le tableau et cela continue jusqu'à la fin.identificateur non résolu - pour la logique de boucle in

Comme vous pouvez le voir, je suis en train de refactoriser l'utilisation de la foulée. Malheureusement var lowest = firstIndex me donne quelques problèmes.

Je devrais être capable de compléter cette fonction en utilisant la foulée droite? Je crois que je devrais utiliser stride: to au lieu de stride: through. Merci à Tim pour cette astuce.

func selOrganize(myList: Array<Int>) -> Array<Int> { 1 

    var extract = myList 

    for firstIndex in 0..<extract.count { 

     var lowest = firstIndex 

     for var secondIndex = firstIndex + 1; secondIndex < extract.count; secondIndex++ { 

      if extract[lowest] > extract[secondIndex] { 
       lowest = secondIndex 
    } 
     } 

     if firstIndex != lowest { 
      swap(&extract[firstIndex], &extract[lowest]) 
     } 
    } 
    return extract 
} 

syntaxe Mise à jour

func selOrganize(myList: Array<Int>) -> Array<Int> { 

var extract = myList 

    // var lowest = firstIndex 

    // Do I need 'key'? Should I declare 'lowest' as a variable here? 
    // If I do use it here I get a "'lowest' is unmutable because it's a let" error 
    for (firstIndex, key) in extract.enumerate() { 

     // < > stride uses 'to' and <= >= stride uses through 
     for secondIndex in (firstIndex).stride(to: 0, by: +1) { 

      if extract[lowest] > extract[secondIndex] { 
       lowest = secondIndex 
      } 
     } 

    if firstIndex != lowest { 
     swap(&extract[firstIndex], &extract[lowest]) 
    } 

} 

return extract 
} 
+0

'a.stride (à: b, par: 1)' comprend les mêmes numéros que 'a .. BallpointBen

Répondre

1

J'ai eu à travailler comme ceci:

func selOrganize(myList: Array<Int>) -> Array<Int> { 

    var extract = myList 

    // Accessing indices is simpler than calling enumerate, and 
    // the function only needs access to the indices, not the 
    // values of the enumeration: 
    for firstIndex in extract.indices { 

     // lowest needs to be defined inside this loop if you 
     // are going to initialize it using firstIndex 
     // because firstIndex isn't defined outside the loop. 
     var lowest = firstIndex 

     // You need to stride from the firstIndex to the end of the 
     // array, so the call to stride should look like this: 
     for secondIndex in firstIndex.stride(to: extract.count, by: 1) { 

      if extract[lowest] > extract[secondIndex] { 
       lowest = secondIndex 
      } 
     } 

     if firstIndex != lowest { 
      swap(&extract[firstIndex], &extract[lowest]) 
     } 
    } 

    return extract 
} 
+0

Merci. Cela semble fonctionner. J'ai branché des numéros dans une aire de jeux. Btw, L'impression originale était 'print (" montrant \ (extrait [plus bas]) et \ (extrait [secondIndex]) ")' mais xcode dit '" Utilisation d'identificateur non résolu 'secondIndex' "' Comment cela est-il possible lorsque secondIndex est Là? – TokyoToo

+0

'secondIndex' est seulement défini dans la boucle' for-in'. Appeliez-vous l'impression en dehors de cette boucle? –

+0

Probablement. Ça fonctionne maintenant. J'ai vraiment besoin d'étudier plus. Je me sens si dense. Peut-être que je suis juste fatigué. Merci beaucoup. Je suis sur le point de terminer ma mission. Btw, comment savoir si je devrais utiliser 'stride' vs standard' for i dans start .. TokyoToo

1

Stride n'est pas nécessaire, vous pouvez le faire avec la norme for i in start..<end syntaxe

func selOrganize(myList: Array<Int>) -> Array<Int> { 

    var extract = myList 

    for firstIndex in 0..<extract.count { 
    var lowest = firstIndex 
    for secondIndex in (firstIndex + 1)..<extract.count { 
     if extract[lowest] > extract[secondIndex] { 
     lowest = secondIndex 
     } 
    } 

    if firstIndex != lowest { 
     swap(&extract[firstIndex], &extract[lowest]) 
    } 
    } 
    return extract 
} 

Mais en fait, vous pouvez faire la même chose dans une ligne

let sortedList = myList.sort{$0 < $1} 
+0

Merci. J'ai copié votre réponse dans mes notes parce que c'est en fait la version la plus «orthodoxe». J'ai marqué la réponse de Roman comme correcte parce qu'elle reflète ce que j'ai utilisé jusqu'ici. Je pense que j'ai utilisé la foulée trop souvent dans mon projet, alors je vais utiliser le vôtre quand je peux. Malheureusement je ne suis pas tout à fait sûr quand je devrais et ne devrais pas utiliser la foulée. – TokyoToo

+0

Je trouve que 'stride' est le plus utile quand on incrémente de plus de 1 index par foulée. Si vous ne faites qu'incrémenter 1 index, ce n'est pas différent d'utiliser une boucle 'for-in'. –