2016-09-23 2 views
0

Я новичок в Swift и пытается найти элегантный способ обработки переменной цикла for, которая может быть отрицательной.Элегантный быстрый способ обработки отрицательного индекса в цикле

func funForLoops(_ loop:Int) { 
    for i in 0..<loop { 
     print("Hello \(i)") 
    } 
} 
funForLoops(1) // prints Hello 0 
funForLoops(0) // doesn't execute 
funForLoops(-1) // runtime error "fatal error: Can't form Range with upperBound < lowerBound" 

Есть более простой способ проверить это, чем это:

if (loop >= 0) { 
    for i in 0..<loop { 
     print("Hello \(i)") 
    } 
} 

Или это:

for i in 0..<(loop >= 0 ? loop : 0) { 

ответ

0

В предположении, вы имеете в виду "если он отрицательный, ничего не делать," (что не является очевидным: вы можете означать «декремент», поэтому он был бы неоднозначным, если бы это не было исключением) синтаксис, который вы хотите:

for i in 0..<max(0, loop) { } 

Это прекрасный синтаксис, когда это необходимо, но в большинстве случаев, если значение может быть неожиданно отрицательным, у вас есть более глубокая проблема в структуре программы, и вы должны решить проблему раньше.

+0

Спасибо! Это именно то, что я имел в виду - «если это отрицательно, ничего не делай» –

0

Да, это не очевидно, какой результат вы хотите иметь. Если вам просто нужно не повторять, независимо от того, отрицательный или не

func forLoop(count: Int) { 
    for i in min(count, 0)..<max(0, count) { 
    print(i) 
    } 
} 

или меньше кода

func forLoop(count: Int) { 
    for i in 0..<abs(count) { 
    print(i) 
    } 
} 

Единственное отличие в том, что первый пример будет производить вывод с отрицательными значениями и останавливается до 0.

Второй пример начинается с 0 и заканчивается на счет-1

Смежные вопросы