본문 바로가기

iOS 개발/Swift

반복문 - for-in, forEach

반응형

반복문

특정 코드 블록을 반복적으로 수행해요

반복 횟수를 정하여 수행하거나(for), 반복 여부를 확인하여 수행(while)합니다.

for : 횟수 반복

while : 조건 반복

 

하지만, 흔히 알고있는 c언어의 for 구문(for (int i = 0; i < 10; i++))은 스위프트 3.0에서 삭제됐어요.

 

오늘은 for-in과 forEach에 대해서 알아볼게요.

 

for-in

for 루프상수 in 순회대상 {
    실행코드
}

순회대상 : 범위, 배열, 딕셔너리, 집합, 문자열 등이 가능해요.

루프상수 : 순회대상의 아이템을 넘겨받아 실행코드 블록에서 사용할 수 있어요.

                와일드카드(_)를 사용하여 생략할 수 있어요.

실행코드 : 반복하여 수행되는 코드에요.

 

포문에서, 순회대상을 상대로 실행코드를 수행합니다.

 

범위로 돌려볼게요

for i in 0...3 {
    print(i)
}

/*
결과
0
1
2
3
*/

 

string을 돌려볼게요

let str = "String"
for char in str {
    print(char)
}

/*
 결과
 S
 t
 r
 i
 n
 g
 */

 

array를 돌려볼게요

let array: [Int] = [0,1,2,3]
for element in array {
    print(element)
}

/*
 결과
 0
 1
 2
 3
 */

 

set을 돌려볼게요

let set: Set<Int> = [1,2,0]
for element in set {
    print(element)
}

/*
 결과
 2
 1
 0
 */

 

dictionary를 돌려볼게요

let dic: [String: Int] = ["one" : 1, "two" : 2]
for element in dic {
    print("\(element.key), \(element.value)")
}
/*
 결과
 two, 2
 one, 1
 */

 

흔히 알고있는 for each와 유사하며, 익숙해지셨죠?

 

다음은 루프 상수 생략(와일드 카드)을 해볼게요.

루프 상수가 필요없을 경우, 언더바(_)를 사용하여 생략 가능합니다.

for _ in 0...3 {
    print("code")
}

/*
결과
code
code
code
code
*/

 

 

forEach

forEach는 고차함수인데, 고차함수는 나중에 알아보도록해요.

지금은 간단하게 뒤에 클로저가 온다고 생각하면 됩니다.

 

순회대상.forEach { 인자 in
    실행코드
}

순회대상.forEach {
    실행코드
}

순회대상 : 배열, 딕셔너리, 집합, 문자열 등이 가능해요.

인자 : 순회대상의 아이템을 넘겨받습니다. 생략하여 $0을 사용할 수 있습니다.

실행코드 : 수행되는 코드에요.

 

순회대상을 상대로 클로저 n번 수행합니다.

 

array를 돌려볼게요

let array = [0,1,2]
array.forEach { element in
    print(element)
}
/*
 결과
 0
 1
 2
 */

 

인자를 생략하여 클로저를 더욱 간결하게 해볼게요?

let array = [0,1,2]
array.forEach {
    print($0)
}
/*
 결과
 0
 1
 2
 */

 

set을 돌려볼게요

let set: Set<Int> = [0,1,2]
set.forEach {
    print($0)
}
/*
 결과
 0
 1
 2
 */

 

string을 돌려볼게요

let str = "String"
str.forEach {
    print($0)
}
/*
 결과
 S
 t
 r
 i
 n
 g
 */

 

dictionary를 돌려볼게요

let dic: [String: Int] = ["one" : 1, "two" : 2]
dic.forEach {
    print($0)
}
/*
 결과
 (key: "two", value: 2)
 (key: "one", value: 1)
 */

dictionary를 한번더 돌려볼게요

let dic: [String: Int] = ["one" : 1, "two" : 2]
dic.forEach {
    print("\($0.key), \($0.value)")
}
/*
 결과
 two, 2
 one, 1
 */

 

 

차이점

아주 중요한 차이점이 있습니다.

사실 forEach는, 반복문이 아니었습니다.

??????????

 

아까 고차함수라고 말씀드렸잖아요.

그래서 forEach에서의 break, continue, return은 다르게 동작합니다.

break, continue, return에 대해서 살펴볼게요.

 

우선 for in 구문에서 break, continue, return 사용에 문제는 없습니다

 

for-in구문의 continue

doForIn()

func doForIn() {
    let str = "String"
    for char in str {
        print(char)
        continue
    }
}

/*
 결과
 S
 t
 r
 i
 n
 g
 */

 

for-in구문의 break : 포문을 종료합니다.

doForIn()

func doForIn() {
    let str = "String"
    for char in str {
        print(char)
        break
    }
}

/*
 결과
 S
 */

 

 

for-in구문의 return : doForIn 함수를 종료합니다.

doForIn()

func doForIn() {
    let str = "String"
    for char in str {
        print(char)
        return
    }
}

/*
 결과
 S
 */

 

 

forEach는 반복문이 아니기 때문에, break, continue 사용이 불가능하며, return 사용에 문제는 없습니다

 

for-in구문의 continue : 에러 발생

 

for-in구문의 break : 에러 발생

 

for-in구문의 return : 클로저를 종료합니다.

doForIn()

func doForIn() {
    let str = "String"
    str.forEach {
        print($0)
        return
    }
}

/*
 결과
 S
 t
 r
 i
 n
 g
 */

 

엉????? 근데 왜 for-in과 forEach에서의 return 결과물이 다르죠?????

왜요????

 

for-in 구문에서의 return은 함수를 종료했죠.

forEach에서의 return은 클로저를 종료합니다.

 

제가 forEach 설명을 다음과 같이 했어요.

"순회대상을 상대로 클로저 n번 수행합니다."

 

return을 통해 클로저를 종료하고, 다음 클로저가 수행되기 때문에

반복횟수에는 영향을 주지 않습니다.

그 결과, String의 모든 캐릭터가 출력됩니다.

 

좀 이해되셨나요???

for-in과 forEach를 쓰더라고, 중요 차이점을 알고 사용해요!!

 

 

* 잘못되거나 부족한 부분에 대한 댓글 감사하게 받겠습니다.

반응형

'iOS 개발 > Swift' 카테고리의 다른 글

반복문 - while, repeat-while  (0) 2021.07.22