이 포스팅은 Swift 시리즈 20 편 중 8 번째 글 입니다.

  • Part 1 - 01: Optional, Any, AnyObject, nil
  • Part 2 - 02: struct, class, enum
  • Part 3 - 03: Closure
  • Part 4 - 04: Property
  • Part 5 - 05: 상속, 생성자, 소멸자
  • Part 6 - 06: 옵셔널 체이닝과 nil 병합
  • Part 7 - 07: 타입 캐스팅
  • Part 8 - This Post
  • Part 9 - 09: Protocol
  • Part 10 - 10: Extention
  • Part 11 - 11: 오류처리
  • Part 12 - 12: 고차함수
  • Part 13 - 13: ARC(Automatic Reference Counting)
  • Part 14 - 14: Access control, Access modifier
  • Part 15 - 15: Generics
  • Part 16 - 16: Optional에 대한 깊은 이해
  • Part 17 - 17: Lazy Variables
  • Part 18 - 18: Enumeration
  • Part 19 - 19: Initialization
  • Part 20 - 20: Concurrency
▼ 목록 보기

목차

▼ 내리기

Assertion

  • assert 함수 사용
  • 디버깅 모드에서만 동작
  • 배포하는 애플리케이션에서는 제외된다.
  • 조건의 검증을, 즉 테스트를 위해서 사용
var someInt: Int = 0

// 검증 조건, 실패 조건을 작성
assert(someInt == 0, "someInt != 0") // 현재는 넘어감

someInt = 1
//assert(someInt == 0) // 동작 실패 : test.playground:7: Assertion failed
//assert(someInt == 0, "someInt != 0") // 동작 실패 : test.playground:8: Assertion failed: someInt != 0

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) // 동작 중지, 검증 실패

  • assert와 같은 역할을 하지만
  • 배포 환경에서 동작하는 precondition이라는 함수도 있다.

guard (Early Exit)

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

functionWithGuard(age: -3) // 나이값이 잘못 입력되었습니다.
functionWithGuard(age: 140) // 나이값이 잘못 입력되었습니다.
functionWithGuard(age: nil) // 나이값이 잘못 입력되었습니다.
functionWithGuard(age: 21) // 당신의 나이는 21입니다.

여기서 알아야 하는 건 unwrappedAge를 아래에서 사용하고 있다는 것이다. if를 쓰면 사용하지 못한다.

// 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
var count = 1
while true {
    guard count < 3 else {
        break
    }
    print(count)
    count += 1
}
// 1
// 2

Reference