아삭아삭 iOS 개발

[Swift 독학] 패스트캠퍼스 챌린지 28일차_assert와 precondition과 guard 본문

Swift

[Swift 독학] 패스트캠퍼스 챌린지 28일차_assert와 precondition과 guard

바닐라머스크 2022. 2. 20. 18:34

■ assert, precondition, guard

  • 앱실행 중 생성되는 다양한 연산 결과값 확인 및 안전한 처리기능 수행

■ assert

  • 특정 조건을 체크하고, 조건이 성립되지 않으면 메세지를 출력하며 에러를 발생시키게 하는 함수
  • assert 함수는 디버깅 모드에서만 동작
    ※ 단, 배포하는 애플리케이션에서는 동작하지 않음
  • assert 함수는 주로 디버깅 중 조건 검증을 위해 사용
    → 유효하지 않는 조건이 발생하지 않도록 코드를 설계하기 위함
  • 검증결과가 true이면 코드는 그대로 진행, false일 경우 코드 실행은 종료되고 앱은 종료
    → 개발과정에서 실수와 잘못된 가정을 찾는데 도움이 되고 실행 문제를 감지하는데 도움이 됨
var height: Int = 0

// 검증 조건에 충족하므로 지나감
assert(height == 0, "height != 0")

height = 175
assert(height == 0) // (동작 중지, 검증 실패) 
assert(height == 0, "height != 0") // (동작 중지, 검증 실패) playground:10: Assertion failed: height != 0

func RollercoasterHeightLimit(height: Int?) {
    assert(height != nil, "height == nil")
    assert((height! >= 120) && (height! <= 200), "롤러코스터 탑승이 불가한 키입니다.")
    print("당신의 키는 \(height!) cm로 롤러코스터 탑승이 가능합니다.")
}

RollercoasterHeightLimit(height: 170) // 당신의 키는 170 cm로 롤러코스터 탑승이 가능합니다.
RollercoasterHeightLimit(height: 80) // (동작 중지, 검증 실패) 롤러코스터 탑승이 불가한 키입니다.
RollercoasterHeightLimit(height: nil) // (동작 중지, 검증 실패) height == nil

 

■ precondition

  • 조건이 거짓일 가능성이 있을 때마다 (강제적인)전제조건인 precondition을 사용
    ※ 단, 코드가 순차적으로 실행되도록 하기위해 확실하게 참이어야 함
  • precondition 함수로 전제조건 작성 가능
  • 1) 어떤 값들의 특정범위 해당여부 또는 2)함수에 유효한 값이 전달되는지 여부를 체크하기 위해 사용
  • 실제 베포 환경에서도 동작 가능
  • precondition( //참거짓이 판단될 표현식// ,  //거짓일 경우 출력될 메시지// )
precondition( // 참거짓이 판단될 표현식// ,  //거짓일 경우 출력될 메시지// )

precondition
(height > 0, "Height must be greater than zero.")

 

■ guard

  • 잘못된 값이 함수에 들어오는 것을 방어하기 위해 사용
    → 조건식으로 뭔가를 검사하여 그 다음에 오는 코드를 실행할지 말지 결정 하는 것
  • 표현식의 부울 값에 따라, guard 구문의 다음을 실행하기 위해 반드시 조건이 true인 것을 요구하기 위해 사용
    1) guard 구문의 조건이 true로 충족되면, guard 구문의 닫는 중괄호 다음으로 이어져서 코드가 실행
    2) guard 구문의 조건이 false로 충족되지 않으면, else절 안의 코드가 실행
        ※ guard 구문은 항상 else 절을 갖음
        ※ 이 블럭은 반드시 guard문이 존재하는 코드 블럭을 종료하기 위해 제어를 이동해야 함
        ※ 특정 코드블럭을 종료하는 지시어(return, break, continue, throw, fatalError(_:file:line)  등) 사용 필수
  • 빠른 종료(early exit)를 위해 사용
  • 디버깅 모드 뿐만 아니라 어떤 조건에서도 동작함
  • 조건의 일부로 옵셔널 바인딩을 사용하여 값이 할당된 모든 변수 또는 상수는 guard문이 존재하는 나머지 코드 블럭에서 사용 가능
  • 함수 내부에서 사용되도록 만들어짐
    ※ 함수에서 딕셔너리를 받아왔을 때 많이 활용됨
    ※ 함수 뿐만 아니라, while 반복문에서도 사용 가능
  • guard문으로 옵셔널 포장지를 벗기는 ‘옵셔널 바인딩’도 가능
    ※ (if를 사용한 옵셔널 바인딩과 달리) guard문을 사용하면 옵셔널 바인딩된 상수를 조건문 범위 밖에서도 사용 가능
  • guard문으로 타입 캐스팅도 가능
func chatting(person: [String: String]) {
    guard let name = person["name"] else {
        return
    }

    print("Hello \(name)!")

    guard let location = person["location"] else {
        print("I hope you're happy now at there")
        return
    }

    print("I hope you're happy now at \(location).")
}


chatting(person: ["name": "Emily"])
// Hello Emily!
// I hope you're happy now at there

chatting(person: ["name": "Emily", "location": "Seoul"])
// Hello Emily!
// I hope you're happy now at Seoul.

 

 

본 게시물은 개인 공부 기록용이므로 내용에 오류가 있을 수 있습니다.

 fast campus강의  참조자료

[1] https://blog.yagom.net/561/

[2] https://bbiguduk.gitbook.io/swift/language-guide-1/the-basics#debugging-with-assertions

[3] https://bbiguduk.gitbook.io/swift/language-guide-1/control-flow#early-exit

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.