swift 기본문법 - assert & guard, assertion, early exit

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.


assert & guard

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

Assert

어떤 결과들을 확인해보는데 사용한다.
디버깅 모드에서만 동작 하고, 배포하는 애플리케이션에서는 동작하지 않는다.

디버깅 중에서도 예상했던 조건들이 확실히 맞는가를 확인할 때 사용한다.

var someInt: Int = 0

// someInt가 0이 맞으면 그냥 지나가고 아니면 someInt != 0 메시지를 반환
assert(someInt == 0), "someInt != 0")  

Early Exit

빠른 종료를 위해 사용한다.

디버깅 구문에서만 사용가능한 assert와는 다르게 guard는 어떤 조건에서도 동작 을 한다.

guard를 사용하여 잘못된 값이 전달됐을 시 특정 실행구문을 빠르게 종료시킨다.
guard의 else 블럭 내부 에는 특정 코드블럭을 종료하는 지시어(return, break 등)가 꼭 있어야 한다.
타입 캐스팅, 옵셔널과도 자주 사용되며 그 외 단순 조건 판단 후 빠르게 종료할 때도 용이다.

func functionWithGuard(age: Int?) {
  guard let unwrapperdAge = age,
      unwrapperdAge < 130,
      unwrapperdAge >= 0 else {
        print("나이값 입력이 잘못되었습니다.")
        return
      }
  print("당신의 나이는 \(unwrapperdAge)세 입니다")
}

if let은 블럭 안에서만 사용가능했지만 guard let은 블럭 바깥에서도 계속 사용할 수 있다.

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

// 혹은
func someFunction(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)")
}
  • 딕셔너리에서 나오는 값은 모두 옵셔널(key에 해당하는 값이 없기 때문)
  • info라는 딕셔너리에서 name이라는 값을 가져와 캐스팅을 시도함
    • Any 타입이기 때문에 실질적으로 사용하기 위해서는 String으로 캐스팅을 시도함