[Swift] for-in, forEach 차이점

12348 단어 고차함수swiftswift

안녕하세요! Kio입니다 👻

오늘은 고차함수 forEach 에 대해 알아보고자 합니다.
이미 for문(For-In Loops) 은 많이 써서 친숙하실텐데요!
동작원리는 비슷(?)합니다. 그럼 어떤 차이점이 있는지 알아볼까요?

Let's get started 🥰




forEach

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

for문과 동일한 순서로 컨테이너의 각 요소에 대해 주어진 클로저를 호출합니다.


선언 (Declaration)

Apple 에서는 forEach 가 아래처럼 정의되어 있네요.

func forEach(_ body: (Element) throws -> Void) rethrows

매개변수 (Parameters)

body

  • body 는 컨테이너의 요소를 매개변수로 사용하는 클로저입니다.



예시 (Discussion)


예시1

무엇보다 예시로 보는 게 좋겠죠?
다음 예제는 같은 결과를 출력합니다.


for-in loop

let numberWords = ["one", "two", "three"]

for word in numberWords {
    print(word)
}
// Prints "one"
// Prints "two"
// Prints "three"

forEach

let numberWords = ["one", "two", "three"]

numberWords.forEach { word in
    print(word)
}
// Prints "one"
// Prints "two"
// Prints "three"



예시2

이번엔 배열의 요소가 1개인 경우를 출력해보겠습니다.


for-in loop

let numbers = [123]

for _ in 0...2 {
    print(numbers[0])
}
// Prints 123
// Prints 123
// Prints 123

forEach

let numbers = [123]

numbers.forEach { number in
    print(number)
}
// Prints 123

차이점이 보이시나요?!

for문 으로는 몇 번 출력할 지 제어할 수 있지만
forEach 는 컨테이너의 각 요소를 클로저에 던져 이용하기 때문에 요소만큼만 가능합니다.



예시3 (break - continue)

for문 에서는 break, continue 를 원할 때 사용할 수 있지만,
forEach 는 반복문이 아니기 때문에 사용할 수 없습니다.
예시를 통해 왜 그런지 확인해볼게요!


for-in loop

let numberWords = ["one", "two", "three"]

for word in numberWords {
    if word == "three" { break }
    print(word)
}
// Prints "one"
// Prints "two"

forEach

let numberWords = ["one", "two", "three"]

numberWords.forEach { word in
    if word == "three" { break } ❌ ❌ ❌
    print(word)
}

forEach 에서는 위의 오류가 보이는 것처럼
breakcontinue 는 반복문 혹은 switch에서만 사용합니다.

그 이유는 forEach 는 위에서 설명한 것처럼 컨테이너의 각 요소를
클로저에 던지는 방식으로 반복문과는 다른 방식으로 작동하기 때문입니다.



예시4 (return)

그러면 return 은 어떨까요?!


for-in loop

let numberWords = ["one", "two", "three"]

func forInLoops() {
    for word in numberWords {
        print(word)
        if word == "two" { return }
    }
}

forInLoops()
// Prints "one"
// Prints "two"

forEach

let numberWords = ["one", "two", "three"]

func forInLoops() {
    numberWords.forEach { word in
        print(word)
        if word == "two" { return } 
    }
}

forInLoops()
// Prints "one"
// Prints "two"
// Prints "three" ❓❓❓

for문 에서는 "two" 까지만 호출 후 정상적으로 함수가 종료된 반면
forEachreturn 을 사용하여도 "three" 까지 출력되었습니다.

forEach 는 클로저를 사용하기 때문에 return 을 사용하더라도
현재 호출에 대해서만 종료하고 후속 호출을 건너뛰지 않기 때문입니다 😱




마치면서

이렇게 forEach 에 대해 알아보았는데요!
for문 과 어떤 점이 다른 지 기억하면 좋을 것 같네요 👻

forEach

  • 컨테이너의 요소를 사용한다는 점
  • 반복문이 아닌 클로저를 사용한다는 점
  • 클로저를 사용하기 때문에 break, continue 사용이 안된다는 점
  • return 을 사용해도 클로저에 대한 호출만 종료된다는 점




참고

forEach - developer.apple
For-In Loops - the swift programming language




잘못된 정보가 있으면 언제든 코멘트 부탁드립니다 👻

좋은 웹페이지 즐겨찾기