관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] guard문 잘 사용하기 (#guard문 사용 시 주의사항, #이중부정, #2중부정) 본문

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
}
Comments