[Swift] for-in, forEach 차이점
안녕하세요!
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
는 컨테이너의 요소를 매개변수로 사용하는 클로저입니다.
Calls the given closure on each element in the sequence in the same order as a for-in loop.
for문과 동일한 순서로 컨테이너의 각 요소에 대해 주어진 클로저를 호출합니다.
Apple
에서는 forEach
가 아래처럼 정의되어 있네요.
func forEach(_ body: (Element) throws -> Void) rethrows
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
에서는 위의 오류가 보이는 것처럼
break
와continue
는 반복문 혹은 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"
까지만 호출 후 정상적으로 함수가 종료된 반면
forEach
는return
을 사용하여도"three"
까지 출력되었습니다.
forEach
는 클로저를 사용하기 때문에return
을 사용하더라도
현재 호출에 대해서만 종료하고 후속 호출을 건너뛰지 않기 때문입니다 😱
마치면서
이렇게 forEach
에 대해 알아보았는데요!
for문
과 어떤 점이 다른 지 기억하면 좋을 것 같네요 👻
forEach
- 컨테이너의 요소를 사용한다는 점
- 반복문이 아닌 클로저를 사용한다는 점
- 클로저를 사용하기 때문에
break
, continue
사용이 안된다는 점
return
을 사용해도 클로저에 대한 호출만 종료된다는 점
이렇게 forEach
에 대해 알아보았는데요!
for문
과 어떤 점이 다른 지 기억하면 좋을 것 같네요 👻
forEach
- 컨테이너의 요소를 사용한다는 점
- 반복문이 아닌 클로저를 사용한다는 점
- 클로저를 사용하기 때문에
break
,continue
사용이 안된다는 점 return
을 사용해도 클로저에 대한 호출만 종료된다는 점
참고
forEach - developer.apple
For-In Loops - the swift programming language
잘못된 정보가 있으면 언제든 코멘트 부탁드립니다 👻
Author And Source
이 문제에 관하여([Swift] for-in, forEach 차이점), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@un1945/Swift-for-in-forEach-차이점저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)