Swift

[Swift] 빠른 종료(Early Exit)

💡빠른 종료 (Early Exit)

guard 키워드를 사용하여 특정 조건에 부합하지 않는다면 재빠르게 코드 블록의 실행을 종료할 수 있습니다.

 

guard 구문은 Bool 타입의 값으로 동작하는 기능이며, 항상 else 구문이 뒤에 따라와야 합니다.

또한, guard의 else 블록 내부에는 특정 코드 블록을 종료하는 return, break, continue, throw 등의 제어문 전환 명령이 꼭 있어야 합니다.

 

다음은 guard 구문 표현 방식입니다.

guard Bool 타입 값 else {
	예외사항 실행문
    제어문 전환 명령어
}

if 구문을 사용하면 else 블록으로 예외사항을 처리해야 하지만

예외사항만 처리하고 싶다면 guard 구문을 사용하는 것이 훨씬 간편하고 읽기 좋게 구성할 수 있습니다.

for i in 0...3 {
    guard i == 2 else {
        continue
    }
    print(i)
}
// 2

위와 같이 Bool 타입의 값으로 guard 구문을 동작시킬 수 있지만 옵셔널 바인딩의 역할도 할 수 있습니다.

 

옵셔널의 값이 있는 상태라면 guard 구문에서 옵셔널 바인딩된 상수를 guard 구문이 실행된 아래 코드부터 함수 내부의 지역 상수처럼 사용할 수 있습니다.

func greet(_ person: [String: String]) {
    guard let name: String = person["name"] else {
        return
    }
    
    print("Hello \(name)")
    
    guard let location: String = person["location"] else {
        print("I hope the weather is nice near you")
        return
    }
    
    print("I hope the weather is nice in \(location)")
}

var personInfo: [String: String] = [String: String]()
personInfo["name"] = "eunseo"

greet(personInfo)
// Hello eunseo
// I hope the weather is nice near you

personInfo["location"] = "Korea"

greet(personInfo)
// Hello eunseo
// I hope the weather is nice in Korea

 

guard 구문에서 좀 더 구체적인 조건을 추가하고 싶다면 쉼표(,)로 추가조건을 나열해주면 됩니다.

func enterClub(name: String?, age: Int?) {
    guard let name: String = name, let age: Int = age, age > 19, name.isEmpty == false else {
        print("You are too young to enter the club")
        return
    }
    
    print("Welcome \(name)!")
}

enterClub(name: "jenny", age: 15)   //You are too young to enter the club
enterClub(name: "eunseo", age: 25)  // Welcome eunseo!

이렇게 쉼표로 추가된 조건은 AND 논리연산(&&)과 같은 결과를 줍니다.

 

이 글은 Swift 프로그래밍 책을 읽고 내용을 정리하여 작성하였습니다.
728x90

'Swift' 카테고리의 다른 글

[Swift] 프로토콜(Protocol)  (0) 2021.01.28
[Swift] 타입캐스팅(Type Casting)  (0) 2021.01.26
[Swift] 옵셔널 체이닝(Optional Chaining)  (0) 2021.01.22
[Swift] 클로저(Closure)  (0) 2021.01.16
[Swift] 이니셜라이저(Initialization)  (0) 2021.01.11