guard문은 값을 언래핑(unwrapping)하기 위해서 옵셔널 바인딩을 이용하며, 그 값이 10보다 작은지 검사
func multiplyByTen(value: Int?) {
guard let number = value, number < 10 else {//조건식(값이 있고 10보다 작은)이 거짓일 때 실행
print("수가 없거나 10보다 크다.") //거짓 : 값이 없거나 10보다 크면
return
}
print(number*10) //조건식이 참일 때 실행, 주의 : number를 여기서도 사용 가능 }
multiplyByTen(value: 3) //30 multiplyByTen(value: nil) multiplyByTen(value: 20)
guard문은 swift 2에 도입된 구문이다.
guard문은 표현식이 거짓(flase)으로 판단될 경우에 수행될 else 절을 반드시 포함해야한다.
guard <불리언 표현식> else {
// 표현식이 거짓일 경우에 실행될 코드
<코드 블록을 빠져 나갈 구문>
}
// 표현식이 참일 경우에 실행되는 코드는 이곳에 위치
guard문은 기본적으로 특정 조건에 맞지 않을 경우에 함수나 반복문에서 빠져 나갈 수 있도록 하는 '조기 출구(early exit)' 전략을 제공한다
guard는 return, break, continue, throw 등 제어문 전환 키워드를 쓸 수 있는 상황이라면 사용이 가능하다.
그래서 함수 뿐 아니라 반복문 등 특정 블록 내부에 있으면 사용 가능하다 물론 함수 내부에 있다면 보통 return을 써서 해당 함수를 조기에 빠져나로는 조기 출구 용도로 사용한다.
실제 앱을 만들다 보면 옵셔널 바인딩 때문에 다중 if~else를 사용해야 하는데, guard~let을 사용하면 다중 루프가 없는 훨씬 가독성이 좋은 코드가 가능해서 그런 경우 많이 사용한다.
var x = 1
while true {
guard x < 5 else { break }
//조건(x<5)이 거짓일 때 실행(break)
print(x) //1 2 3 4, 조건(x<5)이 참일 때 실행
x=x+1
}
func printName(firstName:String, lastName:String?){ // if let
if let lName = lastName { // lastName이 nil이 아니면
print(lName,firstName)
} else {
print("성이 없네요!")
}
}
printName(firstName: "길동", lastName:"홍")
printName(firstName: "길동", lastName:nil)
func printName(firstName:String, lastName:String?){
guard let lName = lastName else { // lastName이 nil이면
print("성이 없네요!")
return // early exit
}
print(lName,firstName)
}
printName(firstName: "길동", lastName:"홍")
printName(firstName: "길동", lastName:nil)
주의 : 언래핑된 변수는 guard let 루프 밖에서 사용 가능하다
iOS프로그래밍기초(22-2학기) 한성현교수님 강의 내용 변형 및 요약