Refactoring (리펙토링)
[iOS - swift] guard문 잘 사용하기 (#guard문 사용 시 주의사항, #이중부정, #2중부정)
jake-kim
2023. 10. 31. 01:08
guard문을 사용하여 과도한 들여쓰기 막기
- guard문은 다른 언어에 거의 없고 swift언어에만 있는 문법
- guard문의 의미는 코드의 흐름에서 막아야 하는 조건이라는 의미
- guard를 사용하면 과도한 들여쓰기를 막고 읽기 쉽게 표현이 가능
ex)
- guard문 쓰기 전
func processUserInput(_ input: String?) {
if let unwrappedInput = input {
if unwrappedInput.count > 0 {
if let intValue = Int(unwrappedInput) {
if intValue >= 0 {
print("입력한 값 > 양수")
} else {
print("입력한 값 > 음수")
}
} else {
print("입력한 값 > 정수 x")
}
} else {
print("입력한 값 > empty")
}
} else {
print("입력한 값 > nil")
}
}
- guard문을 사용하여 과도한 들여쓰기 제한
func processUserInput2(_ input: String?) {
guard let unwrappedInput = input, !unwrappedInput.isEmpty else {
print("입력한 값 > empty or nil")
return
}
guard let intValue = Int(unwrappedInput) else {
print("입력한 값 > 정수 x")
return
}
if intValue >= 0 {
print("입력한 값 > 양수")
} else {
print("입력한 값 > 음수")
}
}
- guard문을 사용하면 위처럼 과도한 들여쓰기를 막고, if문이 아니라 guard라는 키워드이므로 '코드의 진행을 막아야 한다'는 명확한 의미 전달이 쉬운 장점이 존재
guard문 사용 시 주의사항
- '코드의 진행을 막아야 한다'라는 의미로 guard문을 사용하다보면 if문을 사용하지 않는 케이스가 있는데, 이중부정을 하게된다면 guard문이 아닌 if문을 사용할 것
- *이중부정: 부정을 두 번 수행한 코드를 의미
- guard문을 사용하면 조건식이 false인 경우, 코드의 진행사항을 막는데 이 조건식에 부정을하면 개발자는 이 코드를 읽으면서 2번 생각해야하는 안좋은 코드가 됨
// guard문 블럭 return 부분은 value값이 비어있는것의 부정의 부정 (== value.isEmtpy)이 되어야 실행
// 이중부정으로 인해 읽기 어려운 코드
guard !value.isEmpty else {
return
}
- 이럴땐 if문 사용할 것
if value.isEmpty {
return
}