Swift 3.0에서는 C 언어 스타일 for 루프가 더 이상 사용되지 않으므로 재 작성 방법 요약

17136 단어 Swiftfor 문Swift3.0

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)

좋은 웹페이지 즐겨찾기