본문 바로가기
iOS/Swift

Swift-8. assert, precondition, guard

by 헤콩 2023. 2. 24.
반응형

** edwith - Swift 프로그래밍 입문 강의 참고 **

 

 

assert

- assert(_:_:file:line:) 함수 사용

- 디버깅 모드에서만 동작 (실제 배포 환경에서는 동작 X)

- 예상했던 조건의 검증을 위해 사용

- 디버깅 모드에서 assert() 등을 통해 애플리케이션이 죽으면, 죽은 위치가 확실하게 보여집니다. 이를 통해 버그를 방지하거나 디버그에 유용한 정보로 사용할 수 있습니다.

var someInt: Int = 0

// 검증 조건과, 검증 실패시 나타날 문구 작성 //
assert(someInt == 0, "someInt != 0")

someInt = 1
assert(someInt == 0) // 동작 중지, 검증 실패
assert(someInt == 0, "someInt != 0") // 동작 중지, 검증 실패

func fwa(age: Int?) {
    assert(age != nil, "age == nil")
    assert((age! >= 0) && (age! <= 130), "무슨 나이가 이래요")
    print("당신의 나이는 \(age!)세 입니다.")
}

fwa(age: 50) // 출력 : 당신의 나이는 50세 입니다.
fwa(age: -1) // 동작 중지, 검증 실패
fwa(age: nil) // 동작 중지, 검증 실패

precondition

  • precondition(_:_:file:line:) 함수 사용
  • 실제 배포 환경에서도 동작
  • 예상했던 조건의 검증을 위해 사용
  • 실제 배포 환경에서도 동작한다는 것만 제외하면 assert와 동일

guard

  • 빠른 종료(Early Exit)
  • guard 사용 -> 잘못된 값의 전달 시 특정 실행구문을 빠르게 종료
  • 디버깅 모드 뿐만 아니라 어떤 조건에서도 동작
  • guardelse 블럭 내부에는 특정 코드블럭을 종료하는 지시어(return, break 등)가 꼭 필요
  • 타입 캐스팅, 옵셔널과도 자주 사용됨
func fwg(age: Int?) {
    guard let uwAge = age,
        uwAge<130, uwAge >= 0 else {
            print("나이 입력 오류")
            return
        }
        print("당신의 나이는 \(uwAge)세 입니다")
}

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

func sf(info: [String: Any]) {
    // <1>
    guard let name = info["name"] as? String else {
        return
    }
    // <2>
    guard let age = info["age"] as? Int,
    	age >= 0 else {
            return
        }
    print("\(name): \(age)")
}

sf(info: ["name": "aa", "age": "10"]) // <2> 때문에 return되서 출력 X
sf(info: ["name": "bb"]) // <2> 때문에 return되서 출력 X
sf(info: ["name": "hb", "age": 24]) // (출력) hb: 24

 

 

if let 과 guard의 차이

/* if let 옵셔널 바인딩 */
if let uw: Int = someValue {
    // do something
    uw = 3
}
// if 구문 외부에서 uw사용 불가능


/* guard 옵셔널 바인딩 */
guard let uw: Int = someValue else {
    return
}
uw = 3
// guard 구문 외부에서 uw사용 가능
반응형

댓글