优雅的Swift方式处理for循环中的负索引

时间:2016-09-23 03:25:51

标签: swift for-loop swift2 swift3

我是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) {

2 个答案:

答案 0 :(得分:0)

假设你的意思是&#34;如果它是否定的,那么什么也不做,&#34; (这不是显而易见的;你可能意味着&#34;减少,&#34;这就是为什么如果它不是一个例外它将是不明确的)你想要的语法是:

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

这在必要时是一个很好的语法,但在大多数情况下,如果该值可能出乎意料地为负,那么您在程序结构中会遇到更深层次的问题,应该尽快解决问题。

答案 1 :(得分: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开始并以count-1

结束