Swift의 흐름 제어 중 Switch는 다른 언어에서는 보지 못했던 다음과 같은 특징이 존재한다.
오늘은 fallthrough를 중점으로 살펴보고자 한다.
결론부터 이야기하자면 "fallthrough" 사용은 피하는 게 상책이다. 좋은 코드가 나오기 힘들기 때문이다.
사실 fallthrough는 기계적으로 시키는대로 작동할 뿐인데도 코드가 길어지거나 복잡해지면 우리가 논리적으로 구성해놓아도 의도한대로 되었는지 읽고 따라가기 어려운 때가 종종 생기기 마련이다.
다음 2가지의 코드를 살펴보자
var myValue: String = "Joker"
switch myValue {
case "Jenny":
fallthrough
case "Joker":
fallthrough
print("I am \(myValue)")
case "Nova":
fallthrough
print("he or she is \(myValue)")
default:
print("블라블라")
}
2번째 case 조건이 부합되어 case 내부를 실행한다. 단순히 보면 "I am Joker" 와 같은 결과를 기대할 수 있다.
하지만 fallthrough를 만나게 되면 그 즉시 다음 case문 내부를 실행한다. 따라서 다음과 같은 코드를 순차적으로 해석하면
"블라블라" 가 출력될 것임을 알 수 있다.
따라서 해당 코드를 다음 예시와 같이 작성하는 방법이 더 나은 코드라고 생각한다.
<2022-10-17 수정> 예시1에 대한 설명은 하단에 추가 작성.
글의 첫 부분에서 fallthrough의 사용을 최대한 지양하자고 하였는데 그렇다면 fallthrough를 의도한대로 작성한 코드를 간략하게 살펴보자!
import Foundation
var myScore: Int = 100
switch myScore {
case 100:
print("당신은 만점자 입니다.")
let chooseYourOptions: Bool = true
if chooseYourOptions {
fallthrough
} else {
print("당신은 A등급 입니다.")
break
}
case 90...100:
print("당신은 A등급 입니다.")
print("자랑하기!!")
case 80...89:
print("당신은 B등급 입니다.")
default:
print("default Text")
}
(코드 작성이 아직 능숙하지 못한 점 양해 부탁드립니다)
다음과 같이 코드를 작성한 이유는 학창시절 평균 90점이 넘으면 꽤 만족스러운 점수를 받았다고 생각해서 부모님에게 자랑을 했던 기억이 있다.
또한 100점을 받았을때 자랑을 하고 싶을 수도, 하고 싶지 않을 수도 있으니 chooseYourOptions을 통해 선택할 수 있도록 했고. 저라면 무조건 자랑을 할 것이기 때문에 true를 대입연산자로 지정하였습니다.
따라서 100점의 점수를 받은 학생이 tchooseYourOptions에 true를 선택한다면 다음 case의 조건과는 상관없이 내부 내용을 실행할 것이다.
100점인 학생은 "당신은 만점자 입니다." , "당신은 A등급 입니다." , "자랑하기!!"
3가지 결과 값을 갖게 된다.
2차 내용 추가 (수정중)
코드로 설명하기 어려운 상황이라면 사례 중심으로 설명을 하는 습관을 갖자!
var myValue: String = "Joker"
print(myValue)
switch myValue {
case "Jenny", "Joker", "Nova":
print("he or she is \(myValue)")
default:
print("블라블라")
}
Comments