본문으로 바로가기

[Swift] 중첩반복문 labeled break

category Swift/문법 2022. 3. 20. 00:32

스위프트에서 반복문은 break를 통해서 빠져나갈수 있다

이때 반복문을 여러개를 중첩해서 사용한 경우 가장 인접한 반복문을 중단한다

for i in 1...3 {
    print("out: \(i)")
    for j in 1...3 {
        print("in: \(j)")
        if j % 2 == 0 && i > 1 {
            break
        }
    }
}

/*
 out: 1
 in: 1
 in: 2
 in: 3
 out: 2
 in: 1
 in: 2
 out: 3
 in: 1
 in: 2
 */

i가 1보다 크고 j가 짝수일때 break문이 실행된다

break은 두번째 반복문이랑 인접하기 때문에 break문이 실행된 후 두번째 반복문이 종료되고 다시 첫번째 반복문의 다음 싸이클을 도는것을 볼수있다

 

만약 break문이 실행됐을때 첫번째 반복문도 종료하고 싶으면 어떻게 해야할까

지금까지의 난 이렇게 해주었다

var isDone: Bool = false

for i in 1...3 {
    if isDone { break }
    print("out: \(i)")
    for j in 1...3 {
        print("in: \(j)")
        if j % 2 == 0 && i > 1 {
            isDone = true
            break
        }
    }
}

/*
 out: 1
 in: 1
 in: 2
 in: 3
 out: 2
 in: 1
 in: 2
 */

break문이 실행될때 bool타입의 변수(isDone)를 true로 바꾸어주었고 첫번째 반복문에서 그 변수가 true일시 첫번째 반복문도 break되게 해주었다

원하는대로는 됐지만 가독성도 안좋아지고 쓸데없는 변수도 할당해줘야하기때문에 기분이 별로 좋지가 않다

 

그러던중 labeled에 대해서 알게되었다

 

outSide: for i in 1...3 {
    print("out: \(i)")
    for j in 1...3 {
        print("in: \(j)")
        if j % 2 == 0 && i > 1 {
            break outSide
        }
    }
}

/*
 out: 1
 in: 1
 in: 2
 in: 3
 out: 2
 in: 1
 in: 2
 */

반복문 앞에 원하는 Label을 붙여주고

break 뒤에 설정해둔 Label을 붙여주면 된다

그럼 해당 Label의 반복문이 break 된다

 

// labeled 사용
outSide: for i in 1...3 {
    print("out: \(i)")
    for j in 1...3 {
        print("in: \(j)")
        if j % 2 == 0 && i > 1 {
            break outSide
        }
    }
}

// 기존방법
var isDone: Bool = false

for i in 1...3 {
    if isDone { break }
    print("out: \(i)")
    for j in 1...3 {
        print("in: \(j)")
        if j % 2 == 0 && i > 1 {
            isDone = true
            break
        }
    }
}

Hmm...

솔직히 코드가 깔끔해진지는 잘 모르겠는데

가독성은 확실히 좋아진것같다

 

끝.