2016-12-20 3 views
-2
for (var i = 1; i < 1024; i *= 2) { 
    print(i) 
} 

Comment cela peut-il être fait avec une boucle in?Boucle Swift C-style

La solution donnée est pour l'opérateur += et non l'opérateur *=. S'il vous plaît fournir une solution pour *= merci.

+0

Pourquoi voudriez-vous le faire d'une autre manière? La façon dont vous l'avez est plutôt optimale. – Bathsheba

+1

@Bathsheba de cette façon n'est pas possible dans Swift 3. – Fogmeister

+4

Similaire: [Conversion d'un style C pour la boucle qui utilise la division pour l'étape à Swift 3] (http://stackoverflow.com/questions/39903503/converting-ac- style-for-loop-that-utilise-division-for-the-step-to-swift-3) et [Express pour les boucles dans swift avec plage dynamique] (http://stackoverflow.com/questions/40070202/express- for-loops-in-swift-with-dynamic-range) –

Répondre

4

Swift 3 que vous pouvez faire

for f in sequence(first: 1, next: { $0 < (1024/2) ? $0 * 2 : nil }) { 
    print(f) 
} 

Le concept de la fonction sequence est décrite dans le documentation.

Impression d'une liste infinie est facile, le code serait juste

for f in sequence(first: 1, next: {$0 * 2}) { 
    print(f) 
} 

Puisque nous voulons que le programme d'arrêter à un moment donné, nous nous l'opérateur ternaire ? pour mettre fin à la liste une fois que nous arrivons à la valeur maximum. Étant donné que la dernière valeur que nous souhaitons imprimer est 512, la dernière valeur que nous devons doubler est 256. Pour 512 qui ne satisfait pas la condition < (1024/2) nous avons nil et ainsi arrêter.

+0

Oh oui, c'est tellement plus clair que le style C-style. Un pas en avant, deux pas en arrière. Avoir un upvote. – Bathsheba

+0

Notez que la boucle C (de la question) * exclut * la valeur 1024. Votre code inclura ce nombre. –

+2

@MadPhysicist: votre foulée produirait 1, 3, 5, 7, ... et non 1, 2, 4, 8, 16, .... comme vous le souhaitez. –