코드 베이스로 UI를 처음 구성해보던 와중, addSubview 메소드를 사용할 때 forEach
친구를 만나게 되었다.
for in
비슷한 건가 싶기도 하고, 뒤에 붙은 친구는 클로저(해도 해도 어려운!!!!!!!!!!)임이 분명하기에 한번 정리해 보기로
오늘도 공식문서부터
for - in loop와 같은 순서로 sequence의 각 요소들에 대한 클로저를 호출한다.
func forEach(_ body: (Element) throws -> Void) rethrows
✏️ body
: sequence의 요소를 매개변수로 사용하는 클로저
으음 클로저가 sequence의 요소를 매개변수로 사용하여 순환하는구만
클로저에 대해 잘 모른다면~
🔗 https://velog.io/@vvkkiie/Swift-클로저Closure-fkgdro69
오랜만에 보고 나도 공부했당
클로저 구문에 대한 이해만 있으면 쉽게 활용할 수 있는 구문인 것 같다.
let alphabet: [String] = ["A", "B", "C", "D"]
//클로저는 반환값 타입과 타입 정의를 생략할 수 있음
alphabet.forEach { word in
print(word)
}
//실행 결과: A B C D
//매개변수명 대신 $0 사용 가능
alphabet.forEach {
print($0)
}
//실행 결과: A B C D
일단 딱 봤을 때 forEach는 클로저를 사용한다는 것이 가장 큰 차이점인 것 같다! 그리고 다음은 공식 문서에 나와 있는 차이점이다.
1. break나 continue문을 사용하여 body 클로저 호출을 종료하거나 후속 호출을 건너뛸 수 없다
✏️ for-in loop
for word in alphabet {
//B에서 break
if word == "B" { break }
print(word)
}
for-in loop
에서는 위 예시와 같이 break나 continue를 사용할 수 있다. 하지만 forEach
문에서 break나 continue를 사용하려 하면,,,
✏️ forEach
요러한 에러가 뜬다. 루프나 switch문에서만 사용할 수 있다고 한다.
2.body 클로저에서 return을 사용하면, body에 대한 현재 호출만 종료되고 후속 호출은 종료되지 않는다.
✏️ for-in loop
func readAlphabetLoop() {
for word in alphabet {
//B에서 break
if word == "B" { return }
print(word)
}
}
readAlphabetLoop()
//실행결과: A
return
문을 사용해 주기 위해 함수 안에 넣고 호출해 주었음.
실행 결과는 A이다. 현재 호출뿐만 아니라 후속 호출도 종료된다.
✏️ forEach
alphabet.forEach { word in
if word == "B" { return }
print(word)
}
//실행결과: A C D
같은 예시를 forEach
를 사용하여 표현해 보았다. 실행결과가 A C D 인 것을 보면, 현재 호출만 종료되고 후속 호출은 종료되지 않음을 알 수 있다.
이렇게 각자 차이점을 이용해서 적절한 상황에 사용하면 될 듯하다 'ㅅ' 😆