Swift/문법
assert와 guard(assertion / early exit)
khon98
2021. 1. 30. 12:10
assert와 guard
- 애플리케이션이 동작 도중에 생성하는 다양한 결과 값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인하고 빠르게 처리할 수 있음
Assertion
- assert(_:_:file:line:) 함수를 사용
- assert 함수는 디버깅 모드에서만 동작
- 배포하는 애플리케이션에서는 제외됨
- 주로 디버깅 중 조건의 검증을 위하여 사용함
Early Exit
- guard를 사용하여 잘못된 값의 전달 시 특정 실행 구문을 빠르게 종료
- 디버깅 모드뿐만 아니라 어떤 조건에서도 동작함
- guard의 else 블록 내부에는 특정 코드 블록을 종료하는 지시어(return, break 등)가 꼭 있어야 함
- 타입 캐스팅, 옵셔널과도 자주 사용됨
- 그 외 단순 조건 판단 후 빠르게 종료할 때도 용이함
var someInt: Int = 0
// 조건(someInt == 0)을 써주고 0이 맞으면 넘어가고 아니면 "someInt != 0" 나오고 동작 중지
// "someInt != 0"이런 식의 문구는 꼭 안써줘도 됨
assert(someInt == 0, "someInt != 0")
someInt = 1
assert(someInt == 0) // 동작 중지
func functionWithAssert(age: Int?) {
assert(age != nil, "age == nil") // age가 nil이 아닐때 함수 진행, nil이면 오류 발생
assert((age! >= 0) && (age! <= 130), "나이값 입력이 잘못되었습니다")
print("당신의 나이는 \(age!)세 입니다")
}
functionWithAssert(age: 50) // 당신의 나이는 50세 입니다
functionWithAssert(age: -1) // 오류 발생
functionWithAssert(age: nil) // 오류 발생
// Early Exit
func functionWithGuard(age: Int?) {
guard let unwrappedAge = age, // 옵셔널 바인딩 먼저 실행, age가 nil이라면 바로 returnd으로 넘어감
unwrappedAge < 130,
unwrappedAge >= 0 else { // guard에는 else가 꼭 따라 붙음, 조건들이 맞지 않으면 else 실행
print("나이 값 입력이 잘못되었습니다")
return
}
print("당신의 나이는 \(unwrappedAge)세 입니다")
}
var count = 1
// 반복문에서도 사용 가능
while true {
guard count < 3 else {
break
}
print(count)
count += 1
}
// 1
// 2
// dictionary에서도 많이 사용
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)")
}
sumFunction(info: ["name": "khon", "age": "10"]) // 나이가 int 타입이 아닌 string 타입이므로 실행이 되지 않음
sumFunction(info: ["name": "khon01"]) // age가 없으므로 실행 되지 않음
sumFunction(info: ["name": "khon", "age": 10]) // khon: 10