swift 기본문법 - assert & guard, assertion, early exit
16 Jan 2020 | swift개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
인프런, 야곰의 스위프트 기본문법 강좌를 듣고 정리하였습니다.
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으로 캐스팅을 시도함