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

Как это можно сделать для цикла?Swift C-style loop

Данное решение предназначено для: += Оператор не *= Оператор. Пожалуйста, предоставьте решение для *=.

+0

Почему вы хотите сделать это по-другому? То, как у вас есть, довольно оптимально. – Bathsheba

+1

@ Bathsheba этот путь невозможен в Swift 3. – Fogmeister

+4

Аналогично: [Преобразование цикла C для цикла, использующего разделение для шага к Swift 3] (http://stackoverflow.com/questions/39903503/converting-ac- style-for-loop-that-uses-division-for-the-step-to-swift-3) и [Express для циклов в быстром динамическом диапазоне] (http://stackoverflow.com/questions/40070202/express- for-loop-in-swift-with-dynamic-range) –

ответ

4

В Swift 3 вы можете сделать

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

Понятие функции sequence описывается в documentation.

Печать бесконечного списка легко, код будет просто

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

Поскольку мы хотим, чтобы остановить программу в каком-то момент мы с нами троичным оператором?, чтобы завершить список, как только мы достигнем максимальное значение. Поскольку последнее значение, которое мы хотим напечатать, это 512, последнее значение, которое мы должны удвоить, - 256. Для 512, который не удовлетворяет условию < (1024/2), мы имеем nil и тем самым останавливаем.

+0

О да, это намного яснее, чем стиль в стиле C. Один шаг вперед, два шага назад. Имейте upvote. – Bathsheba

+0

Обратите внимание, что цикл C (из вопроса) * исключает * значение 1024. Ваш код будет включать это число. –

+2

@MadPhysicist: ваш шаг будет производить 1, 3, 5, 7, ... и не 1, 2, 4, 8, 16, .... по желанию. –