상세 컨텐츠

본문 제목

[iOS/Swift ] for ~ in VS forEach

IOS/키워드 정리

by 카키IOS 2022. 10. 11. 15:47

본문

⚡️for ~ in

  • 컬렉션에 저장된 요소 수만큼 반복되며, 저장된 요소가 루프 상수에 하나씩 들어간다
  • for - in 문은 그냥 배열하고 동일하게 사용
  • 직접 구현하는 반복문
  • continue, break 가능(반복문 안에서만 쓰이기 때문에)
  • return을 만나면 컴파일 에러

 

⚡️forEach

  • 반복 실행하려는 코드를 파라미터로 받고, 저장된 요소는 클로저 상수로 전달된다
  • 함수의 파라미터로 ‘클로저’로 작성해서 전달
  • continue, break 불가능(forEach는 클로저를 파라미터로 넘겨주는 “메서드”다)
  • return을 만나면 전달한 “클로저”를 종료
  • 클로저를 요소 개수만큼 반복실행하기 때문에 반복 횟수에 영향을 주지 않음

 

func playLoop() {
    let arr: [Int] = [1, 2, 3, 4]

    //for ~ in
    //nums의 요소 갯수만큼 반복문이 반복
    for i in arr { // 1 2 3 4 출력
        print(i)     
    }

    //forEach
    arr.forEach { //1, 2, 3 , 4 출력
        print($0)
    }
}

 

중간탈출

func playLoop() {
    let arr: [Int] = [1, 2, 3, 4]

    //for ~ in
    for i in arr { // 1 출력
        print(i)    
        return //추가
    }

    //forEach
    arr.forEach { //1, 2, 3 , 4 출력
        print($0)
        return //추가
    }
}

 

forEach에서 return을 만나도 1,2,3,4가 그대로 출력되는 이유?

> 클로저는 기능단위 묶음이라 리턴이 클로저 각각 수행되기 때문에 중간탈출은 불가능 (클로저의 특성 참고)

 

그럼에도 불구하고 중간탈출을 하고싶다?

arr.forEach {
    print($0) // 1 2 3 4
    return
}

arr.forEach {
    print($0) // 컴파일 에러
    break
}

arr.forEach {
    print($0) 
    continue // 컴파일 에러 -> return으로 대체
}

arr.forEach { // 1 2
    if $0 > 2 {
        break
    } else {
    	print($0)
    }
}

 

조건문을 넣어주면 됨.

 

그런데 조건문을 활용하면 해당 개념의 특징에 조건을 걸어두는 것이기 때문에

forEach의 특성이 아닌것이 됨.

 

또, 이렇게 쓸 바에 for~in 문이나 while~ 문에 break를 걸어 사용하는게 낫겠죠?

728x90
반응형

관련글 더보기