[Swift 야곰] 2단원. assert와 guard

Jamong·2023년 1월 18일
0

Day 12 - 2023.01.18

assertguard를 사용하면 애플리케이션이 동작 도중에 새성하는 다양한 연산 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있다.

Assertion

  • assert(_:_:file:line:) 함수를 사용한다.
  • assert 함수는 디버깅 모드에서만 동작한다.
  • 배포하는 애플리케이션에서는 제외된다.
  • 예상했던 조건의 검증을 위하여 사용한다.
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 7


func functionWithAssert(age: Int?) {
	
    assert(age != nil, "age == nil")
    
    // age! 옵셔널 벗기기 (age가 nil이면 옵셔널 벗기기 오류 발생)
    assert((age! >= 0) && (age! <= 130), "나이값 입력이 잘못되었습니다.")
    print("당신의 나이는 \(age!)세 입니다.")
}

funtionWithAssert(age: 50)		// 출력 : 당신의 나이는 50세 입니다.

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

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

guard(빠른종료 - Early Exit)

  • guard를 사용하여 잘못된 값의 전달 시 특정 실행구문울 빠르게 종료한다.
  • 디버깅 모드 뿐만 아니라 어떤 조건에서도 동작한다.
  • guard의 else 블럭 내부에는 특정 코드블럭을 종요하는 지시어(return, break 등)가 꼭 있어야 한다.
  • 타입 캐스팅, 옵셔널과도 자주 사용된다.
  • 그 외에도 단순 조건 판단 후 빠르게 종료할 때도 용이한다.
func functionWithGuard(age: Int?) {
    guard let unwrappedAge = age,
    unwrappedAge < 130,
    unwrappedAge < 0 else {
    print("나이값 입력이 잘못되었습니다.")
    return
	}
	
    print("당신의 나이는 \(unwrappedAge)세 입니다.")
}

var count = 1

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

// 출력 - 1
	   - 2

// 딕셔너리에서 나오는 모든 값은 옵셔널이다. (값이 nil일 수도 있어서)
func someFunction(info: [String: Any]) {
	// func 에서 Any 타입이기 때문에 타입 캐스팅을 해준다. (as? String)
	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": "jamong", "age": 25]) // 출력 : jamong: 25

// age가 Int타입이 아닌 String타입이기 때문에 종료
someFunction(info: ["name": "jenny", "age": "10"])
// age값이 없기 대문에 종료
someFunction(info: ["name": "mike"])
profile
새해 목표 : 1일 1 깃, 블로그, 프로그래머스 2문제

0개의 댓글