assert와 guard(assertion, early exit)

2021. 2. 10. 13:30Swift/기초 문법

⭐ assert / guard 

  •  애플리케이션이 동작 도중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 빠르게 처리할 수 있음

 

1. Assertion(assert)

  • assert(_:_:file:line:) 함수를 사용합니다.

  • assert 함수는 디버깅 모드에서만 동작합니다.

  • 배포하는 애플리케이션에서는 제외됩니다.

  • 주로 예상했던 조건의 검증을 위하여 사용합니다.

import Swift

var someInt: Int = 0

// 검증 조건과 실패시 나타날 문구를 작성해 줍니다
// 검증 조건에 부합하므로 지나갑니다
assert(someInt == 0, "someInt != 0")

someInt = 1
//assert(someInt == 0) // 동작 중지, 검증 실패, 출력문은 없음
assert(someInt == 0, "someInt != 0") // 동작 중지, 검증 실패
//출력문: **assertion failed: someInt != 0: file guard_assert.swift, line 26**

func functionWithAssert(age: Int?) {
	assert(age != nil, "age == nil") // nil이 아니면 통과
			
	assert((age! >= 0) && (age! <= 130), "나이값 입력이 잘못되었습니다")
	print("당신의 나이는 \(age!)세입니다")
}

functionWithAssert(age: 50)
//functionWithAssert(age: -1) // 동작 중지, 검증 실패
//functionWithAssert(age: nil) // 동작 중지, 검증 실패

💡 assert(::file:line:)와 같은 역할을 하지만 실제 배포 환경에서도 동작하는 precondition(::file:line:) 함수도 있음 !!

 

2. Early Exit(guard) - 빠른종료

  • guard를 사용하여 잘못된 값의 전달 시 특정 실행구문을 빠르게 종료합니다.

  • 디버깅 모드 뿐만 아니라 어떤 조건에서도 동작합니다.

  • guard의 else 블럭 내부에는 특정 코드블럭을 종료하는 지시어(return, break 등)가 꼭 있어야 합니다.

  • 타입 캐스팅옵셔널과도 자주 사용됩니다.

  • 그 외에도 단순 조건 판단 후 빠르게 종료할 때도 용이합니다.

import Swift

func functionWithGuard(age: Int?) {

	guard let unwrappedAge = age, //age 언랩핑 만약, age가 nil이면 바로 return
		unWrappedAge < 130,
		unWrappedAge >= 0 else {
        print("나이값 입력이 잘못됨")
		return
	}
	

	print("당신의 나이는 \(unWrapperAge)세입니다")
}

var count = 1

while true {
			guard count < 3 else {
					break
			}
			print(count)
			count += 1
}
// 1
// 2


func someFunction(info: [String: Any]) {
		
	//info라는 딕셔너리의 값이 Any이기 때문에 타입캐스팅+guard
	//통과하면 name에 넣어줌
	guard let name = info["name"] as? String else {
		return
	}

	guard let age = info["age"] as? Int, age >= 0 else {
		return
	}		

	print("\(name): \(age)")
}

someFunction(info: ["name": "jenny", "age": "10"]) //age가 String이라 통과 못함
someFunction(info: ["name": "jenny"]) //age가 없어서 통과 못함
someFunction(info: ["name": "jenny", "age": 10]) // jenny: 10

 

  • if let / gurad 를 이용한 옵셔널 바인딩 비교

// 1. if let 옵셔널 바인딩
if let unwrapped: Int = someValue { 
// do something
   unwrapped = 3
} 
// if 구문 외부에서는 unwrapped 사용이 불가능 합니다.
// unwrapped = 5 

// 2. guard 옵셔널 바인딩
// gaurd 구문 이후에도 unwrapped 사용 가능합니다.
guard let unwrapped: Int = someValue else {
         return 
}
unwrapped = 3

 

이 글은 Boostcourse에서 배운 내용을 정리하여 작성하였습니다.

 

'Swift > 기초 문법' 카테고리의 다른 글

익스텐션  (0) 2021.02.10
프로토콜  (0) 2021.02.10
타입 캐스팅  (0) 2021.02.10
옵셔널 체이닝과 nil 병합 연산자  (0) 2021.02.10
인스턴스의 생성과 소멸 (init/deinit)  (0) 2021.02.10