아요 개발 일기

[Swift] Guard문 본문

Swift/Grammar

[Swift] Guard문

소진이 2023. 1. 29. 15:26

안녕하세요 소진입니다 :)

오늘은 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] Function  (0) 2023.01.29
[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