Featured image of post for - in / forEach 비교

for - in / forEach 비교

Collection Type을 돌릴 때 사용하는 for in과 고차함수 .forEach에 대해 알아보자.

for-in ❓ forEach

for - in

You use the for-in loop to iterate over a sequence, such as items in an array, ranges of numbers, or characters in a string.

스위프트 문서에서는 for - in loop를 사용해서 배열의 아이템, 숫자 범위, 문자열에서의 문자와 같은 시퀀스를 반복할 수 있다고 기술되어 있다.

forEach(_:)

Calls the given closure on each element in the sequence in the same order as a for-in loop.

for in loop와 동일한 순서로 시퀀스의 각 요소에 주어진 클로저를 호출한다고 기술되어 있다.

각각의 예제

예제 1 - 각각의 요소 출력

1
2
3
4
5
6
7
8
9
let numbers = [1, 2, 3, 4, 5]

for number in numbers {
    print(number) // 1 2 3 4 5
}

numbers.forEach {
    print($0) // 1 2 3 4 5
}

예제 2 - 인덱스와 값 동시 출력

  • for-in loop 사용
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
let numbers = [1, 2, 3, 4, 5]

// enumerated 사용
for (index, number) in numbers.enumerated() {
    print("index: \(index) number: \(number)")
}
// indices 사용
for index in numbers.indices {
    print("index: \(index) number: \(numbers[index])")
}
// 반복횟수 지정
for index in 0..<numbers.count {
    print("index: \(index) number: \(numbers[index])")
}

3가지 방법 모두 같은 결과를 출력한다. img

  • forEach 사용
1
2
3
4
5
6
7
8
9
let numbers = [1, 2, 3, 4, 5]

numbers.enumerated().forEach {
    print("(index: \($0) num: \($1))")
}

numbers.indices.forEach {
    print("(index: \($0) num: \(numbers[$0]))")
}

for-in과 마찬가지로 enumerated, indices을 사용하면 된다. img

❗️ for-in 의 경우 반복횟수를 지정하여 사용할 수 있었지만, forEach의 경우 각 요소에 주어진 클로저를 호출하는 것이기 때문에 따로 반복횟수를 지정할 수 없고 요소의 개수만큼만 반복할 수 있다.

예제 3 - break / continue 사용

  • for-in loop 사용
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
let numbers = [1, 2, 3, 4, 5]

for number in numbers {
    if number == 3 {
        break
    }
    print(number)
}
// 1
// 2
  • forEach 사용

img break와 continue는 loop와 switch안에서만 사용 가능하다는 오류메세지가 보여짐

forEach에서는 사용 불가

예제 4 - return

  • for-in loop 사용
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
let numbers = [1, 2, 3]

func printForIn() {
    for number in numbers {
        print(number)
        return
    }
}

printForIn()
// 1

반복문을 돌다가 return을 만나면 함수가 종료됨.

  • forEach 사용
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
let numbers = [1, 2, 3]

func printForIn() {
    numbers.forEach {
        print($0)
        return
    }
}

printForIn()
// 1
// 2
// 3

forEach는 클로저를 요소 갯수만큼 실행하기 때문에 return을 만나도 전달했던 클로저를 종료하고 다음 요소의 클로저 호출에는 영향을 주지 않는다.

Reference

https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html

https://developer.apple.com/documentation/swift/array/foreach(_:)

https://babbab2.tistory.com/95?category=828998

https://velog.io/@un1945/Swift-for-in-forEach-%EC%B0%A8%EC%9D%B4%EC%A0%90

Licensed under CC BY-NC-SA 4.0