Swift 3.0에서는 C 언어 스타일 for 루프가 더 이상 사용되지 않으므로 재 작성 방법 요약
C 언어 스타일 for 루프 폐지
C 언어 스타일의 for 루프가 Swift 3.0 에서 폐지될 전망이기 때문에(오류 메시지에는 장래의 표현이지만), 지금까지 이 스타일로 써 온 for 루프를 다시 작성하지 않으면 안 되었습니다. 그래서 일반적인 패턴을 다시 작성하는 방법을 정리해 보았습니다.
for var i = 0 ; i < 100 ; i++
가장 일반적인 C 언어 스타일의 for 루프, 0에서 100 미만의 for 루프의 경우입니다.
// C-Style for statement
for var i = 0 ; i < 100 ; i++ {
print("\(i)")
}
// Swift 3.0 ready
(0 ..< 100).forEach { print("\($0)") }
// Swift 3.0 ready
for i in (0 ..< 100) {
print("\(i)")
}
for var i = 99 ; i >= 0 ; i--
전형적인 내림차순의 경우입니다.
// C-Style for statement
for var i = 99 ; i >= 0 ; i-- {
print("\(i)")
}
reverse()
를 사용합니다.// Swift 3.0 ready
(0 ..< 100).reverse().forEach { print("\($0)") }
// Swift 3.0 ready
for i in (0 ..< 100).reverse() {
print("\(i)")
}
for var i = 0 ; i < 100 ; i += 2
돌이 될 경우입니다.
// C-Style for statement
for var i = 0; i < 100 ; i += 2 {
print("\(i)")
}
stride
를 사용합니다. to
이외에 through
도 있습니다.// Swift 3.0 ready
0.stride(to: 100, by: 2).forEach { print("\($0)") }
stride(to:by:) 와 stride(through:by:) 의 차이
오해할 것 같지만 오름차순의 경우는
to
는 「미만」, through
는 「이하」를 의미하는 것 같습니다. 다음 예제를 참고하십시오.0.stride(to: 20, by: 5) // 0, 5, 10, 15
0.stride(through: 20, by: 5) // 0, 5, 10, 15, 20
for var i = 98 ; i >= 0 ; i -= 2
돌로 내림차순의 경우입니다.
// C-Style for statement
for var i = 98 ; i >= 0 ; i -= 2 {
print("\(i)")
}
// Swift 3.0 ready
98.stride(through: 0, by: -2).forEach { print("\($0)") }
이런 쓰는 방법도 있네요. EDIT¹
// Swift 3.0 ready
0.stride(to: 100, by: 2).reverse().forEach { print("\($0)") }
// Swift 3.0 ready
for i in 0.stride(to: 100, by: 2).reverse() {
print("\(i)")
}
EDIT¹: 오름차순이라면
0.stride(to: 100, by: 2)
라는 표현이 내림차순이면 스트레이트로 표현할 수 없고, 해석이 들어간 것 같은 코드가 될 수밖에 없는 것 같은 생각이 듭니다. 좋은 것 같은 아이디어가 있으면 코멘트 주시면 다행입니다.다음의 재초기화식의 지정이 없고, 각도가 부정의 경우
그다지 좋은 예가 생각나지 않습니다만, 예를 들어 제곱한 값이 홀수인가 짝수인가로, 가산하는 값이 바뀌는 경우를 예로 해 보겠습니다. (예 자체에는 깊은 의미가 없습니다)
// C-Style for statement
for var i = 0 ; i < 100 ; {
print("\(i)")
if (i * i) % 2 == 0 { i += 1 }
else { i += 2 }
}
while 루프로 대체하는 것이 좋을 것 같습니다.
// Swift 3.0 ready
var i = 0
while i < 100 {
print("\(i)")
if (i * i) % 2 == 0 { i += 1 }
else { i += 2 }
}
for 루프에서 조건에 따라 벗어날 수 있는 경우
별로 좋은 예가 생각되지 않지만 주사위를 흔들듯이 난수를 발생시켜 특정 수가 나오면 루프를 끝내게 합시다.
// C-Style for statement
for var i = 0 ; i < 100 ; i++ {
print("\(i)")
if arc4random_uniform(10) == 0 { break }
}
불행히도
forEach {}
에서는 break
문에서 for 루프를 빠질 수 없습니다. 그래서 for
- in
문을 사용합니다.// error: forEach で break は使えない
(0 ..< 100).forEach {
print("\(i)")
if arc4random_uniform(10) == 0 { break } // error
}
// Swift 3.0 ready
for i in 0 ..< 100 {
print("\(i)")
if arc4random_uniform(10) == 0 { break } // OK
}
continue
를 사용하는 경우도 forEach
는 사용할 수 없기 때문에 , 마찬가지로 for
- in
에 재기입할 필요가 있습니다.부동 소수점 등 정수가 아닌 경우 EDIT²
CGFloat 나 Double 등도
Strideable
이므로 마찬가지로 쓸 수 있습니다.CGFloat(0).stride(to: 100, by: 1.5).forEach { print("\($0)") }
0.0.stride(to: 100.0, by: 1.5).forEach { print("\($0)") }
후기
EDIT¹: 예제를 추가했습니다.
EDIT²: 항목을 추가했습니다.
Swift3.0의 정식 출시 시점에서 애플은 "놀라운 코드 전환 도구를 준비"하는 발언을 할 것이라고 생각하지만,이 변환을 자동으로 할 수 있다고 솔직하지는 않습니다. 그 대신, 다음 버전에서의 변경점 등이 warning 로 표시되는 것은, 시간이 생겼을 때에 조금씩 이행시키는 방법은 매우 합리적이라고 생각합니다.
그럼 여러분, Have a happy coding!!
Swift Version:
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
Reference
이 문제에 관하여(Swift 3.0에서는 C 언어 스타일 for 루프가 더 이상 사용되지 않으므로 재 작성 방법 요약), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/codelynx/items/899c26dd2cbdba7d2b00텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)