[Swift 기초] assert와 guard
2022. 4. 5. 14:51ㆍSwift 기초 정리
728x90
//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎
애플리케이션이 동작하는 동중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있다.
1. assert 함수
assert(::file:line:)
assert(condition: Bool)
- 디버깅 중 조건의 검증을 위해 사용
- condition이 true인 경우 그냥 지나침
- 그렇지 않은 경우에는 메세지를 출력하고 동작을 중지시킴
- 디버깅 모드에서만 동장
var someInt: Int = 0
//조건이 true인 경우 그냥 지나치고 그렇지 않으면 메세지를 출력하고 동작을 중지시킴
assert(someInt == 0, "someInt != 0")
someInt = 1
//assert(someInt == 0)
//Assertion failed
//동작 중지, 검증 실패
//assert(someInt == 0, "someInt != 0")
//Assertion failed: someInt !=0
//동작 중지, 검증 실패, 메세지 출력
func functionWithAssert(age: Int?){
assert(age != nil, "age == nil")
assert((age! >= 0) && (age! <= 130), "나이값 입력이 잘못되었습니다.")
//위 assert를 모두 통과하면
print("당신의 나이는 \\(age!)세 입니다.")
}
functionWithAssert(age: 50) //당신의 나이는 50세 입니다.
//functionWithAssert(age: -1) //Assertion failed: 나잇값 입력이 잘못되었습니다.
//functionWithAssert(age: nil) //Assertion failed: age == nil
2. guard 구문
- 조건이 충족되지 않았을 경우 수행되며, 이후의 문장들이 안전하게 수행되도록 보장하는 역할
- 잘못 된 값의 전달 시 특정 실행구문을 빠르게 종료한다.
- 디버깅 모드 뿐만 아니라 어떤 조건에서도 동작한다.
- guard의 else 블럭 내부에는 특정 코드 블럭을 종료하는 지시어(return, break) 필수
- guard let은 if let과 다르게 블럭 밖에서도 사용할 수 있다
- guard 조건문을 통과하면 옵셔널 변수는 자동 해제된다.
- 타입 캐스팅, 옵셔널과 자주 사용됨.
- 비옵셔널 값에 대해서도 사용가능
- 그 외에도 단순 조건 판단 후 빠르게 종료할 떄 용이
func functionWithGuard(age: Int?){
//옵셔널 바인딩 실행 - age가 nil이면 바로 return
//guard에는 else가 필수. 조건과 맞지 않으면 else와 return
//return이 없으면 컴파일 되지 않음
//unwrappedAge는 암시적 해제됨
guard let unwrappedAge = age, unwrappedAge < 130, unwrappedAge >= 0 else {
print("나이값 입력이 잘못되었습니다.")
return
}
//guard let은 if let과 다르게 블럭 밖에서도 사용할 수 있다.
//guard-else 문에 의해 암시적 해제되었기 때문에 unwrappedAge를 바로 사용할 수 있다.
guard unwrappedAge < 100 else{
return
}
//위 guard문과 동일한 내용
// if unwrappedAge < 100 {
//
// }else {
// return
// }
//guard let 구문을 모두 통과하면
print("당신의 나이는 \\(unwrappedAge)세 입니다.")
}
functionWithGuard(age: 180) //나이값 입력이 잘못되었습니다.
functionWithGuard(age: 13) //당신의 나이는 13세 입니다.
2-1. while문에서의 guard 구문
//반복문에서도 사용할 수 있다.
var count = 1
while true{
guard count < 3 else{
break
}
print(count)
count += 1
}
//1
//2
2-2. dictionary를 사용한 guard 구문
- dictionary 값은 모두 옵셔널 - 키에 해당되는 값이 없을 수도 있기 때문
//dictionary에서 활용 - dictionary값은 모두 옵셔널: 키에 해당되는 값이 없을수도 있기 때문에
func someFunction(info: [String: Any]){
//dictionary에서 name이라는 값을 꺼내와서 캐스팅을 시도(Any타입이라서)
guard let name = info["name"] as? String else{
return
}
guard let age = info["age"] as? Int, age >= 0 else{
return
}
//guard let을 모두 통과하면
print("\\(name): \\(age)")
}
someFunction(info: ["name": "ㄱㅅㄱ", "age": 100]) //ㄱㅅㄱ: 100
someFunction(info: ["name": "ㄱㅅㄱ"] )
someFunction(info: ["name": "ㄱㅅㄱ", "age": "100"])
참고하였습니다. 감사합니다.
https://yagom.net/courses/swift-basic/lessons/assert와-guard/
https://www.inflearn.com/course/창원대학교-박동규-교수의-swift-기초-강좌/lecture/1904?tab=note&mm=null
728x90
'Swift 기초 정리' 카테고리의 다른 글
[Swift 기초] 익스텐션 (0) | 2022.04.05 |
---|---|
[Swift 기초] 프로토콜 (0) | 2022.04.05 |
[Swift 기초] 자동참조계수, 강한참조, 약한참조 (0) | 2022.04.04 |
[Swift 기초] 타입캐스팅 (0) | 2022.04.04 |
[Swift 기초] 인스턴스의 생성과 소멸 (0) | 2022.04.02 |