스위프트에서 반복문은 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...
솔직히 코드가 깔끔해진지는 잘 모르겠는데
가독성은 확실히 좋아진것같다
끝.