brunch

You can make anything
by writing

C.S.Lewis

by Robin Kang May 10. 2016

[Swift]감소되는 for 루프

Swift 3.0 부터는 C스타일 for 루프를 문법에서 아예 없앨 예정이라고 한다.

예) C스타일 for 루프
for ( i=0; i < 10; i++ ) {
  //
}

결국 Range 스타일로 짜라는 이야기.

예) Range 스타일 in Swift
for i in 0..<10 {
  //
}


그런데 Range는 start에서 end까지 증가하는 형태이기 때문에 감소하는 for 루프를 쓰려면 reverse를 해줘야 한다.

예) C스타일 감소 루프
for ( i=9; i >= 0; i-- ) {
  //
}

예) Range 스타일 감소 루프 in Swift
for i in (0..<10).reverse() {
  //
}

또는 stride 함수를 써도 구현 가능하다.

예) stride를 사용한 감소 루프 in Swift
for i in 9.stride( through:0, by:-1 ) {
  //
}


그리고 굳이 감소하는 루프를 쓸 필요가 없으면 증가하는 루프로 로직을 구현해도 된다.
나는 max index부터 역으로 rating index까지 off로 바꾸고 그로부터 처음까지 on으로 바꾸기위해 사용했던 오래된 코드를 range로 변경할 때 이런식으로 했다.

변경전)
var i:Int = max_index
for ( ; i >= rating_index; i-=1 ) {
  rates[i]?.image = imgOff
}
for ( ; i >= 0; i-=1 ) {
  rates[i]?.image = imgOn
}

변경후)
for i in 0..<rating_index {
  rates[i]?.image = imgOn
}
for i in rating_index..<max_index {
  rates[i]?.image = imgOff
}

물론 그냥 while 루프를 써서 맘대로 구현해도 전혀 상관은 없겠지.


더 알만한 것들

조건을 걸어서 Range를 사용하는 for 루프

예) 2의 배수로 끊기
for i in (0...max) where i % 2 == 0 {
  //
}

stride를 사용하여 2의 배수로 끊기
예) 0..<max
for i in 0.stride( to:max, by:2 ) {
  //
}
예) 0...max
for i in 0.stride( through:max, by:2 ) {
  //
}



추가로 Swift 3.0부터는 -- 연산자와 ++ 연산자도 없애버린다고 한다.
그래서 -= 1 과 += 1 로 모두 변경해주었다.




브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari