반응형
안녕하세요 소진입니다 :)
오늘은 Guard문에대해 알아보도록하겠습니다!
해당 글은 꼼꼼한 재은씨 Swift: 문법편을 참고하여 작성하였습니다.
guard & assert
애플리케이션이 동작 도중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있습니다.
# guard 문
- if문과 마찬가지로 주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문
- 보통 함수나 메소드에서 사용
- 심각한 오류가 발생할 경우, 전체 구문을 조기 종료(Early Exit)하기 위한 목적
- guard의 else 블럭 내부에는 특정 코드블럭을 종료하는 지시어 (return, break 등)가 꼭 있어야 함
- 타입 캐스팅, 옵셔널과도 자주 사용
- 그 외 단순 조건 판단후 빠르게 종료할 때도 용이
//MARK: - Early Exit
func functionWithGuard(age: Int?) {
guard let unwrappedAge = age, //옵셔널 바인딩을 먼저 실행
unwrappedAge < 130,
unwrappedAge >= 0 else { //guard와 else는 세트
print("나이값 입력이 잘못되었습니다.")
return
}
print("당신의 나이는 \(unwrappedAge)세입니다.") //구문 밖에서도 unwrappedAge사용 가능
}
var count = 1
while true {
guard count < 3 else {
break
}
print(count)
count += 1
}
//1
//2
func somFunction(info: [String: Any]) {
guard let name = info["name"] as? String else {
return
}
guard let age = info["age"] as? Int, age >= 0 else {
return
}
print("\(name): \(age)")
}
somFunction(info: ["name": "jenny", "age": "10"]) //나이가 string - 오류
somFunction(info: ["name": "mike"]) // 나이 값이 없음 - 오류
somFunction(info: ["name": "yagom", "age": 10]) //yagom: 10
옵셔널 바인딩
guard문을 사용하면 옵셔널 바인딩 된 상수를 guard문 밖에서도 사용이 가능합니다.
func test(_name: String?, _age: Int?) }
guard let name = name, let age = age, age < 5 else {
return
}
}
if문과 guard문
if문과 guard문은 주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문으로 비슷하다.
# 차이점
- if 문 - else 블록 필수 X , 표현식의 결과가 참일 때 블록이 실행 됨
- guard문 - else 블록 필수, 표현식의 결과가 참일 때 실행되는 블록이 없다.
# guard문과 if문을 어느 때에 사용하는게 좋을까?
- 조건을 체크하여 실행 흐름을 종료시킬 때에는 guard
- 조건을 체크하되 다른 실행 흐름을 이어나가고 싶을때는 if
다음 예시로 자세히 살펴보자.
# guard 문
func divide ( base : Int) {
guard base != 0 else { // 연산에 실패할 때 조건문 ( base가 0이 아닌게 아니라면?)
print ( " 연산할 수 없습니다")
return
}
let result = 100 / base
print(result)
}
# if 문
func divide ( base : Int) {
if base == 0 { // 연산에 충족할 때 조건문 (base가 0이라면)
print ( " 연산할 수 없습니다")
return
}
let result = 100 / base
print(result)
}
≫ guard 문과 if 문이 바뀔 때, 서로 조건식을 반대로 적어야 함
# Assertion
- assert(_:_:file:line:) 함수를 사용
- assert 함수는 디버깅 모드에서만 동작, 배포하는 애플리케이션에서는 제외
- 주로 디버깅 중 조건의 검증을 위해서 사용
import Swift
//MARK: - Assertion
var someInt: Int = 0
assert(someInt == 0, "someInt != 0")
someInt = 1
//assert(someInt == 0) // 동작 중지, 검증 실패
//assert(someInt == 0, "someInt != 0") // 동작 중지, 검증 실패 (뒤 메세지 출력)
//assert failed: somInt != 0: file guard_assert.swift, line 26
func functionWithAssert(age: Int?) {
assert(age != nil, "age == nil")
assert((age! >= 0) && (age! <= 130), "나이깂 입력이 잘못되었습니다")
print("당신의 나이는 \(age!)세입니다.")
}
functionWithAssert(age: 50)
//functionWithAssert(age: -1) // 동작 중지, 검증 실패
//functionWithAssert(age: nil) // 동작 중지, 검증 실패
반응형
'Swift > Grammar' 카테고리의 다른 글
[Swift] Enum - 열거형 (0) | 2023.01.29 |
---|---|
[Swift] 조건문 - Switch case (0) | 2023.01.29 |
[Swift] Struct - 구조체 (0) | 2023.01.27 |
[Swift] Class - 클래스 (0) | 2023.01.27 |
[Swift] 고차 함수 (0) | 2023.01.27 |