if 구문에 이어서 하는 guard 구문 if 구문이 궁금하면 아래 링크로 가자 !!
Swift 조건문 1
다른 말로 분기분(Branch Statements)라고도 불리는 조건문은 프로그램에서 하나 또는 그 이상의 조건값에 따라 특정 구문을 실행하도록 프로그램의 흐름을 분기하는 역할을 한다. 조건문에 사용되
sheep1sik.tistory.com
오늘은 guard 구문과 #available 구문에 대해 알아보자.
1. guard 구문
guard 구문은 if 구문과 마찬가지로 주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문이다.
if 구문과 차이점은 guard 구문에는 else 블록이 필수지만, 표현식의 결과가 참일 때 실행되는 블록이 없다는 점이다.
guard < 조건식 또는 표현식 > else {
< 조건식 또는 표현식의 결과가 false일 때 실행될 코드 >
}
guard 구문은 주로 후속 코드들이 실행되기 전에 특정 조건을 만족하는지 확인하는 용도로 사용한다.
특정 조건을 만족하지 않은 채로 후속 코드를 실행하면 심각한 오류가 발생할 경우에, 전체 구문을 조기 종료(Early Exit) 하기 위한 목적으로 사용되는 것이 guard 구문이다.
guard 구문의 else 블록에는 이후의 코드 진행을 막아주는 구문이 반드시 포함되어야 한다
📝 return, break 구문 등.. 🙂
guard 구문은 보통 함수나 메서드에서 사용된다. 이때는 return 구문이 조기 종료 처리 역할을 한다.
func divide(base: Int) {
let result = 100 / base
print(result)
}
위 예제 함수를 보자.
이 함수에서 주의해야 할 부분은 입력받은 값을 이용하여 100을 나눈다는 점이다.
나눗셈에서 주의해야 할 아주 유명한 수학적 전제가 하나 있는데, 바로 어떤 숫자든지 0으로 나누어서는 안 된다는 점이다. 이 점은 컴퓨터도 동일하다.
0을 제외한 모든 값을 나눗셈 연산에 사용할 수 있지만, 0으로 나눌 경우에는 오류가 발생한다.
📝 TMI : 이를 'Divide By Zero' 오류라고 함
따라서 입력받은 값이 0이 아닐 때만 함수 내에 코드를 실행하고, 그렇지 않은 경우에는 함수의 실행을 중지해야 한다. 이런 경우를 제어하기 위해 guard 구문을 사용한다.
func divide(base: Int) {
guard base != 0 else {
print("연산할 수 없음")
return
}
let result = 100 / base
print(result)
}
물론 if 구문을 사용하여도 위 예제를 if 구문으로 대체할 수 있다.
if 구문으로 사용하였을 때 코드를 확인해 보자.
func divide(base: Int) {
if base == 0 {
print("연산할 수 없음")
return
}
let result = 100 / base
print(result)
}
여기서 주의할 점은, guard 구문 대신 if 구문으로 사용함으로 인해 조건식이 반대로 바뀐다는 점이다.
guard 구문에서는 나누기 연산을 위해 충족되어야 하는 조건을 사용했다면, if 구문에서는 반대로 연산이 실패할 조건을 사용하여 함수를 종료하도록 처리하고 있다는 걸 유의해서 작성해야 한다.
guard 구문은 언뜻 보기에 if 구문으로 대체가 가능하기 때문에 그다지 필요 없어 보일 수 있지만, guard 구문은 본래 실행 흐름을 종료하기 위한 목적으로 사용되는 코드이기 때문에, 코드를 중첩해서 사용하지 않아도 된다는 장점이 있다.
📝 guard 구문을 많이 사용해도 코드의 깊이가 깊어지지 않기 때문에 전체 코드를 굉장히 깔끔하고 단순하게 만들어줌
새로 배워서 그런가..? 😳😳
이러한 특성 때문에 조건을 체크하여 실행 흐름을 종료시킬 때에는 가급적 guard 구문을 사용하는 것이 좋다.
📝 조건을 체크하되 다른 실행 흐름을 이어나가고 싶은 경우에만 if - else 구문을 사용하면 된다 ✅✅
2. #available 구문
#available 구문은 스위프트 2 버전부터 지원하기 시작한 구문이다.
그 이전에는 OS 버전을 추출하는 API를 직접 호출하여 OS 버전에 대한 값을 얻고, 이를 조건문에서 비교 처리하는 방식으로 버전별 구문을 분리해야 했다.
import UIKit
if ( UIDevice.current().systemVersion.hasPrefix("9")) {
// iOS 9 버전에서 지원하는 구문
} else if ( UIDevice.current().systemVersion.hasPrefix("8")) {
// iOS 8 버전에서 지원하는 구문
} else if ( UIDevice.current().systemVersion.hasPrefix("7")) {
// iOS 7 버전에서 지원하는 구문
} else {
// 기타 나머지 버전에서 지원하는 구문
}
위 예제의 방식이 크게 문제가 있었던 것은 아니지만, 버전을 직접 비교하는 것이 아니라 버전의 문자열을 비교해야 하므로 비교의 한계가 있었다. 이 구문을 #available 구문을 사용하여 처리하면 보다 간결하면서 직접적으로 OS 버전별 구문을 분리할 수 있다.
if #available(<플랫폼이름 버전>, <...>, <*>) {
< 해당 버전에서 사용할 수 있는 API 구문 >
} else {
< API를 사용할 수 없는 환경에 대한 처리 >
}
#available 구문을 사용할 때에는 호출 연산자 ( )를 통해 플랫폼 이름과 버전 등의 인자값을 입력할 수 있는데, 이때 플랫폼 이름과 버전 사이는 공백으로 구분한다.
#available 구문의 인자값은 가변 인자로 정의되어 있기 때문에 입력 개수의 제한이 없다.
📝 쉼표로만 구분하여 플랫폼 이름과 OS 버전을 계속 나열하면 됨
버전값의 나열이 끝나면 마지막은 *로 마감하여 인자값 입력이 모두 끝났음을 선언하고 괄호를 닫아주면 끝!!
#available 구문을 사용할만한 플랫폼은 아래 네 가지가 거의 전부이다.
- 아이폰, 아이패드 등 터치 기반 스마트 기기에 사용되는 iOS
- 맥 컴퓨터에 사용되는 OSX
- 애플 시계에 사용되는 watchOS
- 애플 TV에 사용되는 tvOS
실제로 사용하고자 하는 API가 최신 버전의 OS에서만 사용할 수 있는 것인지, 아니면 대부분의 버전에서 사용할 수 있는 것인지 확인하는 것이 매우 중요하다.
📝 이를 염두에 두지 않고 앱을 개발하면 그 앱은 많은 사용자 환경에서 제대로 구동될 수 없으니깐!?
최신 API를 사용할 때에는 항상 #available 구문을 사용해서 코드를 분리하고, 하위 버전 사용자를 위한 처리까지 해 주어야 한다.
📝 3탄은 Switch 구문 !!
📝 3탄 업로드 완료 !!
Swift 조건문 3
if 구문과 guard 구문이 궁금하다면 아래 링크로🙂 Swift 조건문 1 다른 말로 분기분(Branch Statements)라고도 불리는 조건문은 프로그램에서 하나 또는 그 이상의 조건값에 따라 특정 구문을 실행하도
sheep1sik.tistory.com
'메모장' 카테고리의 다른 글
Swift 배열 (4) | 2023.03.13 |
---|---|
Swift 조건문 3 (3) | 2023.03.09 |
Swift 조건문 1 (2) | 2023.03.07 |
Swift 타입 추론과 타입 어노테이션 (1) | 2023.03.06 |
Swift 기본 자료형 2 (1) | 2023.03.06 |